TCP/IP长期连接

3
我有一个服务器应用程序,运行在Linux机器上。我可以从Windows/Linux机器连接到这个应用程序,并发送/接收数据。几个小时后,客户端会出现以下错误:
在Windows上:远程主机强制关闭了一个现有的连接 在Linux上:连接超时 我在网上搜索并找到一些帖子建议增加/减少操作系统的保持活动时间。然而,这对我没有起作用。
我能否找到解决这个问题的方法,还是当连接被强制关闭时,我应该尝试重新连接到服务器? 编辑:我已经跟踪了这个情况。我向远程节点发送了一条数据,并在等待5个小时后发送了另一条数据。发送方发送了第一条数据,但当发送方发送第二条数据时,没有响应。发送方的TCP/IP堆栈通过增加重试次数重复了这个过程5次。最后,发送方重置了连接。我不能确定为什么会发生这种情况(可能是由于防火墙或NAT - 请参见第2.4节),但我采用了两种不同的方法来解决这个问题:
  1. 使用setsockopt使用TCP/IP保持活动状态(第4.2节
  2. 进行应用程序级别的保持活动状态。这更可靠,因为第一种方法与操作系统有关。

1
你读过这个问题/答案吗: https://dev59.com/bHE85IYBdhLWcg3w2HVa - jdiver
我现在阅读了。我将通过Wireshark跟踪交换的数据,谢谢。 - Ricardo Cristian Ramirez
1个回答

3
这取决于你的应用程序需要做什么。更多的信息和你用来监听和处理连接的代码可能会有所帮助。
不管怎样,从技术上讲,保持长时间的keep-alive时间应该可以防止操作系统中断你的连接。因此,也许是其他原因导致了问题。
这种情况可能是路由器故障或者流量导致你的keep-alive数据包丢失。如果你还没有在局域网上进行测试(没有大量的流量),我建议你这样做。
这也可能是由于你的套接字处理方式(从你的问题中无法确定)。这篇文章可能会有所帮助。 具有超时的非阻塞套接字 我不太熟悉Linux上的连接处理方式,但我认为操作系统不会不必要地中断连接。你可以重新建立连接作为恢复,但你需要考虑到并非所有的断开连接都是温和的,因此你可能会在实际上想要关闭的连接上进行恢复。
由于它是TCP,它会尽力进行温和的断开连接,但是在断开连接之前,你可以发送一个自定义消息告诉服务器或客户端不要重新建立连接。这样你就可以绝对确定,尽管这应该是不必要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接