Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 修改connect()超时时间_C++_C_Sockets - Fatal编程技术网

C++ 修改connect()超时时间

C++ 修改connect()超时时间,c++,c,sockets,C++,C,Sockets,我做了一点搜索,似乎找不到我正在寻找的答案,我能找到的唯一答案是使用select查看套接字是否超时,这是我正在做的 我想知道的是,在connect()超时之前,是否需要更改时间长度?我目前正在使用select(),它返回时将errno设置为EINPROGRESS,直到最终返回时将ETIMEDOUT。我是否可以更改此ETIMEDOUT发生之前所需的时间?目前它发生在大约60秒之后。我已尝试调整传入select()调用的超时值,但这只影响select()超时所需的时间。setsockopt(3)允许

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

我想知道的是,在
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()返回所需的时间。正如我所说的,您不能将超时延长到平台默认值之外。没有意义。如果连接要成功的话,它将在几秒钟内成功。