在客户端连接后使用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连接到服务器时,服务器和客户端只是等待超时然后退出。
你的问题就在这里:select(1,
。 nfds
值应该是:“三个集合中任何一个中编号最大的文件描述符加1”(所以说我的系统上的socket(2)联机帮助页)。
我打赌你的socketServer
fd是3.你应该使用socketServer + 1
而不是1
。