情况如下:
创建并初始化fd_set:
fd_set readset; //fd_set named readset
FD_ZERO(&readset); //clearing fd_set
FD_SET(listen_socket, &readset); //adding a listening socket to readset
/*use for timeout*/
timeval blocktime;
blocktime.tv_sec=0;
blocktime.tv_usec=0;
现在,当前值显示 listen_socket
已添加到读取集中:
readset.fd_count = 1
readset.fd_array[0] = 116
此指令出现问题:
int err = select (0x7FFFFFFF, &readset, NULL, NULL, &blocktime);
我预计 select()
将返回值 1,因为我向 readset 添加了一个监听套接字。相反,select()
返回 0,并且 readset.fd_count 的值减 1。
新值是:
readset.fd_count = 0 readset.fd_array[0] = 116
我找不到这里发生了什么。我正在 Windows 7 上编程。任何帮助将不胜感激!
最佳答案
您传入了零时间的有效超时。它正确更新了您的读取集,告诉您在允许的零时间内,读取集中的零个套接字具有可读数据。
三个选项:
- 给它更长的超时时间,这样它就有机会找到事情做
- 循环直到更新您的读取集以指示某些内容具有可读数据
- 将超时参数设置为 null 以无限期阻止
您可能希望将 #1 和 #2 组合在一起,但这取决于您的用例。
关于C++ select() 减少文件描述符计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20877218/