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

时间:2014-05-23 07:49:17

标签: c# .net vb.net sockets

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

要从客户端检索数据包,我正在使用"而"像这样的方法:

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(缓冲区)”状态时,服务器不会从客户端收到数据包。命令。我已经测试了很多次,但我仍然没有幸运能保持连接超过1小时。

我已经调查了这个问题,但它仍然很奇怪:

  • 服务器未安装任何防火墙软件。

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

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

  • 我做了一个' ping -t'从我的客户端计算机到服务器并继续查看它以确保客户端和服务器之间没有连接丢失。 ping命令表示ping时间通常在5ms到50ms之间,不会发生连接超时。

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

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

1 个答案:

答案 0 :(得分:3)

可能服务器支持某种具有空闲连接超时的防火墙(Cisco ASA等)。当你"打"通过防火墙/ NAT设备,"会话"在防火墙内核中创建。有一个必须回收的关联资源,因此防火墙通常不允许无限制的连接超时,但防火墙确实支持死连接检测等。

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

当我说keepalive时,我并不是指TCP keepalive套接字选项。这是一个零长度的数据包,并且可以通过良好的防火墙检测到,如思科。思科管理员可以设置规则来悄悄地拒绝您的keepalive数据包,因此解决方案是在应用程序的TCP层之上实现它图层,通过发送一小段数据,如" KEEPALIVE \ r \ n"。