【问题标题】:How to accept socket with timeout如何接受超时的套接字
【发布时间】:2012-12-26 19:11:48
【问题描述】:

是否存在超时跨平台解决方案以使用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;
}

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

【问题讨论】:

  • @ryanbwork 否,超时为 10
  • 是立即弹出选择还是等待 10 秒后弹出(如果您没有连接到它)?它看起来不错(除了提到的非 Windows 平台的 s+1),还有其他问题……
  • @Boris,你解决过这个问题吗?如果是这样,您可以选择一个答案或自己写一个答案吗?

标签: c linux windows


【解决方案1】:

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

【讨论】:

  • 谢谢,但我现在正在 Windows 上测试,因为我知道第一个参数在 Windows 上被忽略
  • 你能确保你的传入连接发生在你的 10 秒窗口内吗?
【解决方案2】:

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

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

应该可以。

【讨论】:

    【解决方案3】:

    select() 如果套接字发出信号,则返回 >0,超时返回 0,错误返回 -1。 select() 实际返回给您的价值是什么?您只检查 >0 和

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多