【问题标题】:TCP/IP long-term connectionsTCP/IP 长期连接
【发布时间】:2014-06-28 04:57:51
【问题描述】:

我有一个在 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) 使用 TCP/IP 保持活动状态
  2. 使应用程序级别保持活动状态。这更可靠,因为第一种方法与操作系统相关。

【问题讨论】:

标签: tcp network-programming tcp-ip


【解决方案1】:

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

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

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

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

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

由于是 TCP,它会尽最大努力进行温和的断开连接,但您可以发送自定义消息告诉服务器或客户端不要在断开连接之前重新建立连接。这样您就可以绝对确定,尽管没有必要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2012-04-12
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    相关资源
    最近更新 更多