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

c++ select() decrement file descriptor count

本文关键字:描述 文件 select C++      更新时间:2023-10-16
情况

是这样的:

创建并初始化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, and blocktime);

我希望select()会返回值 1,因为我在 readset 中添加了一个侦听套接字。相反,select()返回 0,并且 readset.fd_count 的值递减 1。

新值为:

readset.fd_count = 0
readset.fd_array[0] = 116

我找不到这里发生了什么。我在Windows 7上编程。任何帮助将不胜感激!

您传递的有效超时为零。它正确地更新了读取集,以告诉您,在允许的零时间内,读取集中的零套接字具有可读数据。

三个选项:

  • 给它更长的超时时间,这样它就有机会找到一些事情来做
  • 循环,直到它更新您的读取集以指示某些内容具有可读数据
  • 将超时参数设置为 null 以无限期阻止

您可能希望在那里组合 #1 和 #2,但这取决于您的用例。

阅读文档。 select()更新提供的fd_set记录,以指示哪些套接字满足请求的状态。 返回值>0 表示满足一个或多个套接字,0 表示发生超时且在指定的超时期限内没有满足任何套接字,-1 表示错误。 您使用的超时为 0,因此如果套接字不能立即读取,则读取fd_set将被清除。

顺便说一句,select()的第一个参数不在 Windows 上使用,应设置为 0。