客户端通常在几十分钟后与服务器断开连接

本文关键字:服务器 断开 连接 十分钟后 客户端 | 更新日期: 2023-09-27 18:04:40

我在。net (c#或vb.net)中使用TCPListener - Socket在端口8080上创建了一个服务器-客户端通信程序。简单来说,这个程序就像一个聊天软件,客户端连接到服务器端,然后等待对方的消息,然后处理它。

从客户端获取数据包,我们使用"While"方法,如下所示:

While true
Dim Buffer(4096) As Byte
s.Receive(Buffer)
Dim strDataReceived As String = System.Text.Encoding.ASCII.GetString(Buffer)
ProcessData(strDataReceived) 'Process data received...........
End while

在本地测试server.exe-client.exe时,软件可以正常工作几个小时,没有任何问题。

但是当我开始在我的真实服务器上运行server.exe时,服务器-客户端之间的连接通常在几十分钟后客户端连接时彼此丢失。现象是客户端向服务器发送数据包,但服务器没有收到来自客户端的数据包,而服务器仍然站在'sck.receive(Buffer)'命令中。我已经测试了很多次,但我仍然没有幸运地保持连接运行超过1小时。

我已经调查了一下这个问题,但还是很奇怪:

  • 服务器没有安装防火墙软件

  • 客户端未使用任何代理和防病毒、防火墙软件

  • 我在服务器上使用带宽记录软件来确保我的服务器上的互联网是稳定的。

  • 我从客户端计算机到服务器执行'ping -t',并继续查看它以确保客户端和服务器之间没有连接丢失。ping命令表示ping时间一般在5ms ~ 50ms之间,没有出现连接超时的情况

  • 甚至我尝试在客户端计算机中拔掉网线几秒钟,然后重新插入以模拟断开连接事件。我很高兴我的服务器-客户端之间的连接仍然保持,这不是导致我症状的问题。

我想写一个代码自动重新连接,如果收到超时。但如果上述症状仍然存在,它可能会使我的软件在重新连接时通常延迟。我真的很想知道我的代码出了什么问题,这是我解决上述症状的解决方案?

客户端通常在几十分钟后与服务器断开连接

可能服务器在某种防火墙(Cisco ASA等)后面,有空闲连接超时。当您"击穿"防火墙/NAT设备时,在防火墙内核中创建一个"会话"。有一个相关的资源必须回收,所以防火墙通常不允许无限的连接超时,但防火墙确实支持诸如死连接检测之类的功能。

每5分钟添加一个keepalive数据包/活动,或者断开连接/重新连接是唯一的方法。很少有网络管理员会修改他们的配置来适应这一点。在自定义TCP应用协议中实现"ping"或"keepalive"命令非常简单。只需发送字符串并使用它,您甚至不必响应数据包来完成防火墙内的空闲计时器重置,尽管这可能是最佳实践。

当我说keepalive时,我不是指TCP keepalive套接字选项。这是一个零长度的数据包,可以被一个好的防火墙(比如Cisco)检测到。思科管理员可以设置规则来悄悄地拒绝你的keepalive数据包,所以解决方案是在TCP层之上,在应用层,通过发送一个像"keepalive 'r'n"这样的小数据串来实现它。