TCP/IP长期连接

TCP/IP长期连接,tcp,network-programming,tcp-ip,Tcp,Network Programming,Tcp Ip,我有一个在Linux机器上运行的服务器应用程序。我可以从Windows/Linux计算机连接此应用程序,并可以发送/接收数据。几个小时后,发生了一些事情,客户端出现了以下错误 在Windows上:远程主机强制关闭了现有连接 在Linux上:连接超时 我在网上搜索了一下,发现一些帖子建议增加/减少操作系统的生存时间。然而,这对我不起作用 我可以找到这个问题的解决方法吗?还是应该在连接被强制关闭时尝试重新连接到服务器 编辑:我已经跟踪了情况。我向远程节点发送了一个数据,并在等待5小时后发送了另一个数

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

在Windows上:
远程主机强制关闭了现有连接

在Linux上:
连接超时

我在网上搜索了一下,发现一些帖子建议增加/减少操作系统的生存时间。然而,这对我不起作用

我可以找到这个问题的解决方法吗?还是应该在连接被强制关闭时尝试重新连接到服务器

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

  • 使用setsockopt()使用TCP/IP保持活动状态
  • 使应用程序级别保持活动状态。这更可靠,因为第一种方法与操作系统相关

  • 这取决于应用程序应该做什么。再多了解一些信息,也许您用于监听和处理连接的代码会有所帮助

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

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

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

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


    因为它是TCP,所以它会尽最大努力轻轻断开连接,但是您可以发送一条自定义消息,告诉服务器或客户端在断开连接之前不要重新建立连接。这样你就可以绝对肯定了,尽管不需要这样做。

    你读过这个问题/答案吗:我现在读。我将通过wireshark跟踪交换的数据,谢谢。