C++ 修改connect()超时时间
我做了一点搜索,似乎找不到我正在寻找的答案,我能找到的唯一答案是使用select查看套接字是否超时,这是我正在做的 我想知道的是,在C++ 修改connect()超时时间,c++,c,sockets,C++,C,Sockets,我做了一点搜索,似乎找不到我正在寻找的答案,我能找到的唯一答案是使用select查看套接字是否超时,这是我正在做的 我想知道的是,在connect()超时之前,是否需要更改时间长度?我目前正在使用select(),它返回时将errno设置为EINPROGRESS,直到最终返回时将ETIMEDOUT。我是否可以更改此ETIMEDOUT发生之前所需的时间?目前它发生在大约60秒之后。我已尝试调整传入select()调用的超时值,但这只影响select()超时所需的时间。setsockopt(3)允许
connect()
超时之前,是否需要更改时间长度?我目前正在使用select()
,它返回时将errno
设置为EINPROGRESS
,直到最终返回时将ETIMEDOUT
。我是否可以更改此ETIMEDOUT
发生之前所需的时间?目前它发生在大约60秒之后。我已尝试调整传入select()
调用的超时值,但这只影响select()
超时所需的时间。setsockopt(3)允许您设置:
稍微令人困惑的是,超时值实际上是套接字的属性
您正在寻找的选项是:sou SNDTIMEO和sou RCVTIMEO
编辑
如评论中所述,这不适用于connect。原因如下:
作为一种解决方案,建议设置内核在初始握手失败后为建立连接而发送的重试SYN数据包的数量限制。自上次重试以来,时间增加了一倍,这意味着a)您只能设置重试次数,这间接地增加了连接超时值;b)这是特定于操作系统且系统范围的。可能不是你的解决方案
connect()
select()
或poll()
或epoll()
,指定所需的超时,并将套接字指定为writefd
,即阻止,直到超时过期或套接字变为可写getsockopt()
获取套接字上的最后一个错误,并查看它是否为零。如果是,则连接成功,否则连接失败请注意,您不能通过这种方式将连接超时增加到平台默认值(大约一分钟)之外,但可以将其减少。不幸的是,这对我不起作用。我的套接字在60秒左右之后仍然超时,即使在将您提到的两个属性都设置为120秒之后也是如此。我还注意到,您为
setsockopt
链接的手册页提到,默认情况下,这两个选项都设置为0,因此不会超时。您是对的。关于这一点有一个评论:罗伯托提到它们根本无法设置。看起来我提到的选项只有在建立连接后才可用。很抱歉我想那就到下层了。如果你问我的话,我觉得有点傻。似乎所有建议使用select的人都没有意识到传递给select的超时不会影响实际套接字连接的超时,而是影响调用select()
本身的超时。当然,有一种简单的方法可以指定您不想让connect()
超时x个时间长度。@不,所以确实没有办法增加connect()
的超时时间?这两个选项都不会影响连接超时时间,而且我看不出这些“套接字属性”有什么“混淆”的地方。它们还将成为什么的属性-1正如我所说,这是我已经在做的事情。我的问题是如何延长超时之前的时间长度。select中指定的超时不起任何作用,但确定如果什么都没有发生,select()返回所需的时间。正如我所说的,您不能将超时延长到平台默认值之外。没有意义。如果连接要成功的话,它将在几秒钟内成功。