POSIX选择Never Returns Positive

问题描述 投票:0回答:1

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

posix unix-socket
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.