POSIX选择从不返回正数

时间:2018-09-06 18:37:10

标签: posix unix-socket

客户端连接后,使用UNIX Domain Socket服务器调用

select时永远不会返回。

我的代码,没有错误检查和安全性:

服务器:

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连接到服务器时,服务器和客户端只需等待超时然后退出即可。

1 个答案:

答案 0 :(得分:1)

您的问题就在这里:select(1,nfds的值应为:“三组中编号最高的文件描述符,加1”(这样说,就是我系统上的socket(2)联机帮助页)。

我敢打赌,您的socketServer fd为3。您应该使用socketServer + 1而不是1