首页 > 解决方案 > POSIX 选择从不返回正数

问题描述

select在客户端连接后使用 UNIX 域套接字服务器调用它时永远不会返回。

我的代码,为了清楚起见,没有错误检查和安全性:

服务器:

int socketServer = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, "/tmp/unixdomainsocket");
bind(socketServer, (struct sockaddr*)&address, sizeof(struct sockaddr_un));
listen(socketServer, 5);

fd_set handleSet;
FD_ZERO(&handleSet);
FD_SET(socketServer, &handleSet);

struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 10000000;

printf("%d\n", select(1, &handleSet, NULL, NULL, &timeout));

close(socketServer);
unlink("/tmp/unixdomainsocket");

客户:

echo "Hello from the borne again shell! | nc -U /tmp/unixdomainsocket

我能做些什么来解决这个问题?我发现的例子说这应该有效,但文档只是说这是为了阅读。当我尝试使用为第四个参数设置的句柄时,它仍然没有返回 true。

当 shell 连接到服务器时,服务器和客户端只需等待超时然后退出。

标签: posixunix-socket

解决方案


你的问题就在这里:select(1,. 该nfds值应该是:“三组中任何一个中编号最高的文件描述符,加 1”(所以说我系统上的 socket(2) 联机帮助页)。

我打赌你的socketServerfd 是 3。你应该使用socketServer + 1而不是1.


推荐阅读