C 如何接受带超时的套接字

C 如何接受带超时的套接字,c,linux,windows,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)time

使用
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;
}
如何解决这个问题?
谢谢

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

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

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

应该可以工作。

select()
如果发出套接字信号,则返回>0,超时时返回0,错误时返回-1。
select()
实际返回给您的值是多少?您只检查>0和@ryanbwork否,超时为10它是立即从select弹出还是在弹出前等待10秒(如果您没有连接到它)?它看起来不错(除了提到的非Windows平台的s+1之外),还有其他问题…@Boris,你解决过这个问题吗?如果是这样,您能选择一个答案或自己写一个吗?谢谢,但我现在正在Windows上测试,因为我知道Windows上忽略了第一个参数。您能确保您的传入连接在10秒内进行吗?