C++ linux TCP/IP编程中的精确定时
我知道有两种解决方法。一个是心跳技术,另一个是我的问题:保持活力 我知道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有时不发送?我如何才能确保“保持活力”探测器始终能够发送。我应该做些别的事吗 谢谢你的帮助 编辑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++代码中设置这些
在我看来,这就像未确认传输后的指数退避。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。这就是为什么我看到有时它工作得很好,而另一次它失败了。谢谢你的帮助:)