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

C++ c++;select()递减文件描述符计数,c++,windows,sockets,select,tcp,C++,Windows,Sockets,Select,Tcp,情况如下: 创建并初始化fd_集: 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 b

情况如下:

创建并初始化fd_集:

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\u socket
已添加到readset:

readset.fd_count = 1
readset.fd_array[0] = 116
此说明中出现问题:

int err=select(0x7FFFFFFF,&readset,NULL,NULL,&blocktime)

我希望
select()
将返回值1,因为我向readset添加了一个侦听套接字。相反,
select()
返回0,readset.fd\u count的值递减1

新值为:


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

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

三种选择:

  • 给它一个更长的超时时间,这样它就有机会找到事情做
  • 循环,直到它更新您的readset以指示某些内容具有可读数据
  • 将timeout参数设置为null以无限期阻塞
您可能希望在那里合并#1和#2,但这取决于您的用例。

select()
更新提供的
fd\u集
记录,以指示哪些套接字满足请求的状态。返回值>0表示满足一个或多个套接字,0表示发生超时且在指定的超时时间内未满足任何套接字,而-1表示错误。您使用的超时值为0,因此,如果套接字无法立即读取,则您的读取集将被清除

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

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