TCP / IP长期连接

里卡多·克里斯蒂安·拉米雷斯

我有一个在Linux机器上运行的服务器应用程序。我可以从Windows / Linux计算机连接此应用程序,并且可以发送/接收数据。几个小时后,发生了一些事情,并且在客户端出现了以下错误。

在Windows上: An existing connection was forcibly closed by the remote host

在Linux上: Connection timed out

我在网上进行了搜索,发现了一些建议增加或减少OS的存活时间的帖子。但是,它对我没有用。

我是否可以解决此问题,还是应该在强制关闭连接时尝试重新连接到服务器?

编辑:我已经跟踪了情况。等待5个小时后,我向远程节点发送了数据,并发送了另一数据。发送方发送了第一个数据,但发件人发送了第二个没有响应的数据。发送方的TCP / IP堆栈通过增加重试之间的时间来重复此5次。最后,发件人重置连接。我不确定为什么会发生这种情况(可能是由于防火墙或NAT-参见2.4节),但是我采用了两种不同的方法来解决此问题:

  1. 使用TCP / IP使用setsockopt保持活动(第4.2节
  2. 使应用程序级别保持活动状态。由于第一种方法与OS相关,因此这更可靠。
埃里亚斯(Elias)Ringhauge

这取决于您的应用程序应该做什么。多一点信息,也许您用于侦听和处理连接的代码可能会有所帮助。

无论如何,从技术上讲,更长的存活时间应该可以防止操作系统中断您的使用。因此,也许是造成麻烦的其他原因。

这样的事情可能是路由器故障或流量导致您的保持活动数据包丢失。如果您尚未在局域网上进行测试(不进行繁琐的流量测试),则建议您这样做。

这也可能是由于套接字的处理方式(我无法从您的问题中确定)。本文可能会有所帮助。非阻塞套接字,具有超时

我不习惯在Linux上处理连接的方式,但是我希望操作系统不会切断不必要的连接。您可以重新建立连接以进行恢复,但是您需要考虑到并非所有断开连接都是温和的,因此最终可能会在实际上希望关闭的连接上进行恢复。

由于它是TCP,因此将尽其所能进行轻微的断开连接,但是您可以发送一条自定义消息,告诉服务器或客户端在断开连接之前不要重新建立连接。这样,您绝对可以确定,尽管这样做没有必要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章