繁体   English   中英

尝试与线程之间的套接字建立内部连接并连接失败

[英]Trying to establish an internal connection with sockets between threads and connect fails

我正在尝试使用AF_INET系列的套接字在同一进程的线程之间创建本地连接。
服务器应该通过与线程的多路复用来处理客户端并处理其请求。

因此,在服务器的主线程中,我具有用于外部连接的功能:( 为了保持帖子的长度合理,省略了检查错误的操作)

struct sockaddr_in server_addr;
struct sockaddr *serverptr=(struct sockaddr *)&server_addr;
listening_sock = socket(AF_INET, SOCK_STREAM, 0);
fds[0].fd = listening_sock;
fds[0].events = POLLIN;
// Setting listening socket
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
int one = 1;
setsockopt(listening_sock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(one));
setsockopt(listening_sock, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one));
bind(listening_sock, serverptr, sizeof(server_addr));
listen(listening_sock, 5);

然后使用poll我正在侦听套接字上成功轮询(与客户端通信)。

现在,我想通过TCP创建一个内部套接字,以在主线程和将创建的新线程之间进行通信。
我添加了这些:

struct sockaddr_in loopback_addr;
struct sockaddr *loopbackptr=(struct sockaddr *)&loopback_addr;
loopback_sock = socket(AF_INET, SOCK_STREAM, 0); //checking for errors is omitted
fds[1].fd = loopback_sock;
fds[1].events = POLLIN;
// Setting loopback socket
loopback_addr.sin_addr.s_addr = htonl(IN_LOOPBACKNET);
loopback_addr.sin_family = AF_INET;
loopback_addr.sin_port = htons(18000);
int one = 1;
setsockopt(loopback_sock, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(one));
setsockopt(loopback_sock, IPPROTO_TCP, TCP_NODELAY, (void *)&one, sizeof(one));
bind(loopback_sock, loopback_ptr, sizeof(loopback_addr));
listen(loopback_sock, 5);

并且还将nfds计数器增加到2。
现在,线程在轮询循环之前启动,并尝试与此代码进行通信:

struct sockaddr_in server;
struct sockaddr *serverptr = (struct sockaddr*)&server;
int sock;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    perror("thread: socket");
    pthread_exit((void*)-1);
}

int port = 18000;
server.sin_family = AF_INET;      
server.sin_addr.s_addr = IN_LOOPBACKNET; 
server.sin_port = htons(port);        
if (connect(sock, serverptr, sizeof (server)) < 0)
{
    perror("thread: connect");
    pthread_exit((void*)-1);
}

发生的情况是connect syscall返回thread: connect: Network is unreachable

在服务器的主循环中,我有这个:

if (fd[1].revents)
    printf("Loopback socket\n");

检查此套接字是否存在任何异常,但这绝不会打印出任何内容。

我不确定如何设置内部套接字,如果有我可以阅读的教程,那么欢迎提供链接!

这可能很简单,但是由于我不熟悉套接字编程,所以找不到它。


编辑:
按照alk的建议将IN_LOOPBACKNET更改为htonl(INADDR_LOOPBACK)之后,connect仍然失败,但是出现一条新消息, connection refused
但是,仍然没有fds [2]的帮助。

从错误消息( Network is unreachable )中,您可以得出结论,寻址有些混乱。

所以你可能想改变

IN_LOOPBACKNET

成为

INADDR_LOOPBACK

前者解析为127 ,最有可能不是您想要的,因为它是本地环回网络。

后者更适合,因为它解析为0x7f000001 ,它由回送地址127.0.0.1的整数表示。


另外,在分配客户端应连接的ip地址时,还会丢失到网络字节顺序( htonl() )的转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM