gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:58:10 25 4
gpt4 key购买 nike

我在 .NET(c# 或 vb.net)中创建了一个服务器-客户端通信程序,使用 TCPListener - 端口 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 设备时,会在防火墙内核中创建一个“ session ”。有一个关联的资源必须被回收,所以防火墙通常不允许无限的连接超时,但防火墙确实支持诸如死连接检测之类的东西。

    每 5 分钟添加一个 keepalive 数据包/事件,或者断开/重新连接是解决此问题的唯一方法。很少有网络管理员会更改他们的配置以适应这种情况。在自定义 TCP 应用程序协议(protocol)中实现“ping”或“keepalive”命令非常简单。只需发送字符串并使用它,您甚至不必响应数据包即可完成防火墙内的空闲计时器的重置,尽管这可能是最佳实践。

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

    关于c# - 客户端通常在几十分钟后与服务器断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23823762/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com