9

我做了一些搜索,似乎找不到我正在寻找的答案,我能找到的唯一答案是使用 select 查看套接字是否超时,这是我已经在做的。

我想知道的是无论如何要改变connect()超时之前的时间长度吗?我目前正在使用select()which 返回errnoset toEINPROGRESS直到最终返回ETIMEDOUT. 无论如何我可以改变发生这种情况之前需要的时间ETIMEDOUT吗?目前它发生在大约 60 秒后。我尝试调整传递给select()调用的超时值,但这只会影响超时之前需要多长时间select()

4

2 回答 2

4
  1. 创建套接字。
  2. 将其置于非阻塞模式。
  3. 问题connect()
  4. 调用select()or poll()or epoll(),指定您想要的超时时间,并将套接字指定为 a writefd,即阻塞直到超时到期或套接字变为可写。
  5. 如果超时到期,请关闭套接字等。
  6. 否则通过获取套接字上的最后一个错误getsockopt()并查看它是否为零。如果是,则连接成功,否则连接失败。

请注意,您不能通过这种方式将连接超时时间增加到超过平台默认值(大约一分钟),但您可以减少它。

于 2013-06-17T10:39:50.383 回答
1

setsockopt(3) 允许你设置这个: http: //linux.die.net/man/3/setsockopt

有点令人困惑,超时值实际上是套接字的属性。

您正在寻找的选项是:SO_SNDTIMEO 和 SO_RCVTIMEO

编辑 如评论中所述,这不适用于连接。原因如下: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout 作为一种解决方案,建议对内核在初始握手失败后发送的用于建立连接的重试 SYN 数据包的数量进行限制。自上次重试以来,时间加倍,这意味着 a) 您只能设置重试次数,这间接累加到连接超时值,b) 这是特定于操作系统和系统范围的。可能不是您的解决方案....

于 2013-06-17T09:41:44.687 回答