C++ select() 减少文件描述符计数

标签 c++ windows sockets select tcp

情况如下:

创建并初始化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/

相关文章:

linux - 如何解决 Linux 上的 "too many open files"错误?

c++ - 获取应用程序目录中的文件列表

windows - 如何在 Windows 上使用 Perl 确定操作系统的位数?

c++ - 将一个模块的所有代码放在一个接口(interface)后面。好主意与否?

C++11 std::threads vs posix 线程

windows - 如何在cmd中进行简单的文件搜索

java - 在java中读取TCP问题

python - 从头开始编码以太网桥

c++ - 从 C++ 调用 C 程序并传递参数

C++ 将变量类型传递给函数