我正在尝试使用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。
现在线程在poll循环之前启动,并尝试与以下代码通信:
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 socketn");
检查是否有任何与这个套接字的交互,但这不会打印任何东西。
我不确定如何设置内部套接字,如果有教程,我可以阅读,一个链接将比欢迎更多!
它可能是一些简单的东西,但由于我是新的套接字编程我找不到它。
编辑:
按照alk的建议将IN_LOOPBACKNET更改为htonl(INADDR_LOOPBACK)后,连接仍然失败,但有一个新的消息connection refused
。
但是,仍然没有来自fds的预防措施[2]。
从错误消息(Network is unreachable
),你可以得出结论,有一些可疑的寻址。
所以你可能想改变
IN_LOOPBACKNET
INADDR_LOOPBACK
前者解析为127
,这很可能不是您想要的,因为它是本地环回网络。
后者更适合,因为它解析为0x7f000001
,它列出了环回地址127.0.0.1
的整数表示形式。
当分配客户端要连接的ip地址时,您还缺少到网络字节顺序(htonl()
)的转换。