如何接受超时套接字

时间:2012-12-26 19:11:49

标签: c linux windows

是否存在使用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;
}

如何解决这个问题? 谢谢!

3 个答案:

答案 0 :(得分:3)

select调用的第一个参数应该等于fd_set集中的最高编号文件描述符加1(参见here)。尝试将第一个参数更改为s+1;当你的集合中有多个套接字时,你需要添加一些逻辑。

答案 1 :(得分:1)

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

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

应该有用。

答案 2 :(得分:1)

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