TCP / IP长期连接

时间:2014-05-10 13:42:40

标签: tcp network-programming tcp-ip

我有一台在Linux机器上运行的服务器应用程序。我可以从Windows / Linux机器连接此应用程序,并可以发送/接收数据。几个小时后,出现了一些问题,我在客户端遇到了错误。

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

在Linux上:Connection timed out

我在网上进行了搜索,发现了一些建议增加/减少操作系统保持活动时间的帖子。但是,它对我没用。

我是否可以找到这个问题的灵魂,或者我是否应该在强行关闭连接时尝试重新连接到服务器?

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

  1. 使用setsockopt(Section 4.2
  2. 使用TCP / IP保持活动状态
  3. 使应用程序级别保持活跃状态​​。由于第一种方法与操作系统相关,因此更可靠。

1 个答案:

答案 0 :(得分:1)

这取决于您的应用程序应该做什么。更多信息以及用于监听和处理连接的代码可能会有所帮助。

无论如何,技术上更长的保持活动时间,应该阻止操作系统切断你。所以也许是造成麻烦的其他因素。

这样的事情可能是路由器故障或流量导致保持活动数据包丢失。 如果您还没有在局域网上测试它(没有繁重的流量)我建议这样做。

这也可能是由于您的套接字处理方式(我无法从您的问题中确定) 本文可能有所帮助。 Non blocking socket with timeout

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

由于它是TCP,它会尽力轻松断开连接,但您可以发送自定义消息,告知服务器或客户端在断开连接之前不要重新建立连接。这样你就完全可以肯定,尽管没有必要这样做。