修改connect()超时时间

时间:2013-06-17 09:37:47

标签: c++ c sockets

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

我想知道的是,无论如何要改变connect()超时之前的时间长度?我目前正在使用select(),其errno设置为EINPROGRESS,最后返回ETIMEDOUT。无论如何我可以改变ETIMEDOUT发生之前所需的时间吗?目前它发生在大约60秒后。我已尝试调整传入select()调用的超时值,但这只会影响select()超时所需的时间。

2 个答案:

答案 0 :(得分:2)

  1. 创建套接字。
  2. 将其置于非阻止模式。
  3. 问题connect()
  4. 调用select()poll()epoll(),指定所需的超时,并将套接字指定为writefd,即阻塞直到超时到期或套接字变为可写
  5. 如果超时到期,请关闭套接字等。
  6. 否则通过iotcl()获取套接字上的最后一个错误,看看它是否为零。如果是,则连接成功,否则失败。
  7. 请注意,通过这种方式,您无法将连接超时增加到平台默认值(大约一分钟),但您可以减少它。

答案 1 :(得分: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)这是特定于操作系统和系统范围的。可能不是你的解决方案......