7

是否存在超时跨平台解决方案来接受客户端使用accept功能而不将套接字设置为非阻塞?

我知道我应该使用select功能,但我做错了什么?

SOCKET NativesAcceptClient(SOCKET s, int timeout)
{
   int iResult;
   struct timeval tv;
   fd_set rfds;
   FD_ZERO(&rfds);
   FD_SET(s, &rfds);

   tv.tv_sec = (long)timeout;
   tv.tv_usec = 0;

   iResult = select(s, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
   if(iResult > 0)
   {
      return accept(s, NULL, NULL);
   }
   else
   {
     //always here, even if i connect from another application
   }
   return 0;
}

如何解决?谢谢!

4

3 回答 3

3

调用的第一个参数select应该等于 fd_set 集中的最大文件描述符加 1(参见此处)。尝试将第一个参数更改为s+1; 当您的集合中有多个插槽时,您将需要添加一些逻辑。

于 2012-12-26T19:22:26.360 回答
1

select() 的第一个参数是一个 int,它至少任何位集中的文件描述符的最大值大 1。在这种情况下

iResult = select(s + 1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);

应该管用。

于 2012-12-26T19:29:45.353 回答
1

select()如果套接字发出信号,则返回 >0,超时返回 0,错误返回 -1。什么价值select()实际上返回给你?您只检查 >0 和 <=0,这意味着您没有区分 -1 和 0。如果它返回 0,则没有客户端连接到您的套接字,但如果它返回 -1,那么您的套接字很可能一开始就无效。

于 2012-12-26T20:59:44.077 回答