gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:02 25 4
gpt4 key购买 nike

我正在尝试使用 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);

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

现在我想通过 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);
}

发生的是连接系统调用返回thread: connect: Network is unreachable

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

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

检查是否与这个套接字有任何交互,但是这不会打印出任何东西。

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

它可能很简单,但由于我是套接字编程的新手,我找不到它。


编辑:
按照 alk 的建议将 IN_LOOPBACKNET 更改为 htonl(INADDR_LOOPBACK) 后,连接仍然失败,但有一条新消息,连接被拒绝
但是,fds[2] 仍然没有任何反应。

最佳答案

根据错误消息(网络无法访问),您可以得出结论,寻址有问题。

所以你可能想改变

IN_LOOPBACKNET

成为

INADDR_LOOPBACK

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

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


在分配客户端应连接的 ip 地址时,您还缺少到网络字节顺序的转换(htonl())。

关于c - 尝试与线程之间的套接字建立内部连接并连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16761888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com