如何接受超时套接字

Bor*_*ris 5 c linux windows

是否存在超时交叉平台soulution以接受客户端使用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;
}
Run Code Online (Sandbox Code Playgroud)

如何解决?谢谢!

rya*_*ork 3

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