Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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++ linux TCP/IP编程中的精确定时_C++_Linux_Sockets_Tcp_Keep Alive - Fatal编程技术网

C++ linux TCP/IP编程中的精确定时

C++ linux TCP/IP编程中的精确定时,c++,linux,sockets,tcp,keep-alive,C++,Linux,Sockets,Tcp,Keep Alive,我知道有两种解决方法。一个是心跳技术,另一个是我的问题:保持活力 我知道keep alive有如下特点: tcp_keepalive_time\tcp_keepalive_intvl\tcp_keepalive_Probe 我把它们设定为 5秒\1秒\10 这意味着keepalive例程在发送第一个keepalive探测之前等待5秒,然后每1秒重新发送一次。如果连续10次未收到ACK响应,则连接被标记为断开 我确实启用了生存,并通过调用 SETSOKOPT()/在Linux的C++代码中设置这些

我知道有两种解决方法。一个是心跳技术,另一个是我的问题:保持活力

我知道keep alive有如下特点:

tcp_keepalive_time\tcp_keepalive_intvl\tcp_keepalive_Probe

我把它们设定为

5秒\1秒\10

这意味着keepalive例程在发送第一个keepalive探测之前等待5秒,然后每1秒重新发送一次。如果连续10次未收到ACK响应,则连接被标记为断开

<>我确实启用了生存,并通过调用<强> SETSOKOPT()/<强>在Linux的C++代码中设置这些属性,有时,它的工作原理如下:

但在其他时间,keep alive不发送,而重传消息已发送并停止:

它只发送7次(每次重发之间的时间大于1秒,几乎为2~5秒)。然后很长一段时间口吃

那么为什么TCP keep alive有时不发送?我如何才能确保“保持活力”探测器始终能够发送。我应该做些别的事吗

谢谢你的帮助

编辑

  • 正如@West所说的,阻塞是由于未确认的传输后的指数退避造成的,但为什么重新传输会阻塞发送保持活动探测的过程呢?有什么优先权吗

  • 在我看来,这就像未确认传输后的指数退避。TCP_MAXRT将允许您设置在放弃尝试传输之前要等待多长时间。TM_TCP_MAX_REXMIT将允许您设置最大重试次数。

    我有点困惑,TCP_MAXRT的值真的会影响keep alive的传输吗?你能澄清一下吗,非常感谢。我不确定这是不是“保持活力”。我认为这可能是常规重传的指数退避。“这就是我为什么要提出这些建议的原因。@billhoo:我想他说的是肯定的。”。它不发送更多的keep-alive,而是等待已经发送的keep-alive的ACK,这是一组不同的计时器。在应用程序中保留“保持活动状态”通常更简单:空闲时,每N秒发送一条消息,如果X秒后没有回复,则中止。@BraveNewCurrency收到了,但我们现在无法更改应用程序的协议,所以我会尝试控制重传的事情,并在这里给出反馈。@West我最终发现keep alive probe的优先级低于重传数据包,因此如果ACK未成功传输,则会触发重传,并且无法发送第一个keep alive probe。这就是为什么我看到有时它工作得很好,而另一次它失败了。谢谢你的帮助:)