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

时间:2014-01-02 06:02:46

标签: 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:

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上编程。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

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

三个选项:

  • 给它一个更长的超时,所以它有机会找到要做的事情
  • 循环,直到更新您的readset以指示某些内容具有可读数据
  • 将timeout参数设置为null以无限期阻止

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

答案 1 :(得分:0)

Read the documentationselect()更新提供的fd_set记录以指示哪个(哪些)套接字满足所请求的状态。返回值> 0表示满足一个或多个套接字,0表示发生超时,并且在指定的超时时间段内没有满足套接字,-1表示错误。您使用的超时为0,因此如果套接字不能立即读取,则会清除读取fd_set

BTW,select()的第一个参数未在Windows上使用,应设置为0.