Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 客户端通常在几十分钟后与服务器断开连接_C#_.net_Vb.net_Sockets - Fatal编程技术网

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

C# 客户端通常在几十分钟后与服务器断开连接,c#,.net,vb.net,sockets,C#,.net,Vb.net,Sockets,我使用端口8080上的TCPListener-Socket在.NET(c#或vb.NET)中创建了一个服务器-客户机通信程序。简单地说,这个程序就像一个聊天软件,客户端连接到服务器,两者都等待对方的消息,然后进行处理 要从客户端检索数据包,我使用的是“While”方法如下: While true Dim Buffer(4096) As Byte s.Receive(Buffer) Dim strDataReceived As String = System.Text.Encoding.AS

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

要从客户端检索数据包,我使用的是“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时间通常在5毫秒到50毫秒之间,并且不会发生连接超时

  • 甚至我尝试拔下客户端计算机中的网络电缆几秒钟,然后再次重新插入以模拟断开连接事件。我很高兴我的服务器和客户端之间的连接仍在维护中,这不是导致我症状的问题


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

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

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


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

我不知道为什么它会断开一个真实的、实时的连接(可能是关于套接字闲置和关闭的原因),也许比我更了解TCP的人可以回答这个问题。但是,您真的想让连接闲置那么长时间吗?在我见过的大多数实现中,如果软件想让套接字保持长时间打开而不接收数据,那么每隔一段时间就会发送一个keep-alive数据包,以确保套接字保持活动状态。哦,确保你是a)刷新流(如果它是缓冲的)和b)不影响nagle效应我发现通常是ISP断开长时间运行的TCP连接。如果我是OP,我会编写服务器来侦听传入的连接,而不需要while循环。当客户端发送消息时,它会执行“连接-发送-断开”来发送消息。读取消息可以是不同的例行程序,其中客户端被设置为监听,而不是while循环。当客户端第一次连接时,即使在断开连接后,服务器也会将其保持为“这是一个开放连接”,以便知道在有消息要发送时向客户端发送消息。我同意keealive数据包。但是,当他谈论几十分钟的时候,他并不是在使用nagle算法。那个算法不是那样工作的。缓冲/延迟在TCP堆栈内完成,并且在高传输速率下也相关,而不是跨多分钟。堆栈将在若干毫秒内自行刷新数据包。如果TCP套接字设置正确,则不必刷新它。实际上,在大多数操作系统上都无法刷新它。也许通过切换TCP_节点延迟,就像我在Linux上读到的那样。如果有什么不同的话,nagle只会影响性能。我不确定nagle算法在这里是否相关——这更多是因为组合短数据包以减少数据包头的开销。更可能是连接超时,因为没有任何流量。是的,我为错误信息道歉。Nagle只在短时间内有效,就像我提到的,我没有在服务器上安装任何防火墙。服务器中的所有软件都是自Windows安装后由我安装的,因此我完全知道没有安装防火墙。那么您的客户端和服务器在同一物理网络上?我没说“服务器”有防火墙。我的意思是防火墙在客户端和服务器之间。除非它们在同一个网络上,否则你可能正在通过防火墙而不知道它。客户端也是我的家庭计算机(也使用我的家庭网络),因此我知道它上面没有防火墙。我也在跑步