我做了一些搜索,似乎无法找到我正在寻找的答案,我能找到的唯一答案是使用select来查看套接字是否超时这是我已经在做什么
我想知道的是,无论如何要改变connect()
超时之前的时间长度?我目前正在使用select()
,其errno
设置为EINPROGRESS
,最后返回ETIMEDOUT
。无论如何我可以改变ETIMEDOUT
发生之前所需的时间吗?目前它发生在大约60秒后。我已尝试调整传入select()
调用的超时值,但这只会影响select()
超时所需的时间。
答案 0 :(得分:2)
connect()
。select()
或poll()
或epoll()
,指定所需的超时,并将套接字指定为writefd
,即阻塞直到超时到期或套接字变为可写iotcl()
获取套接字上的最后一个错误,看看它是否为零。如果是,则连接成功,否则失败。请注意,通过这种方式,您无法将连接超时增加到平台默认值(大约一分钟),但您可以减少它。
答案 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)这是特定于操作系统和系统范围的。可能不是你的解决方案......