posix - 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 连接到服务器时,服务器和客户端只需等待超时然后退出。
解决方案
你的问题就在这里:select(1,
. 该nfds
值应该是:“三组中任何一个中编号最高的文件描述符,加 1”(所以说我系统上的 socket(2) 联机帮助页)。
我打赌你的socketServer
fd 是 3。你应该使用socketServer + 1
而不是1
.
推荐阅读
- json - 比较两个嵌套字典并将它们的值的差异存储到一个新字典中
- java - 如何使用工厂为特定主题配置 Spring Kafka 侦听器?
- python - Pandas - 具有多个输出的 GroupBy
- python - 你能在 sorted() 中定义一个命名函数吗?
- jquery - Ajax:ajax 成功的未定义值
- php - 计算注册日期和 1 年之间的天数
- asp.net-core - 为什么我的控制器返回错误的响应数据?
- linux - 有没有办法在 ZLinux 上编写 IBM 的 BAL?
- r - Mac 上的 R 网址功能
- multithreading - 不在 FX 应用程序线程上;currentThread = Thread-5