SocketError.ConnectionReset in TCP Socket的可能原因是什么
本文关键字:是什么 ConnectionReset in TCP Socket SocketError | 更新日期: 2023-09-27 18:25:16
我有一个基于TCP套接字的客户端服务器系统。一切正常,但是当网络从客户端断开连接并再次重新连接时,我会自动发送表单客户端SocketError.ConnectionReset
关于此命令,套接字在服务器端关闭。这也很好。
但是当我查看客户端时,它显示套接字仍然与服务器连接。(关于套接字仍然与服务器连接[并非每次都发生],有时显示断开连接,有时显示已连接(
"服务器从中获取
SocketError.ConnectionReset
是否有意义 客户端,但客户端仍处于连接状态"?
所以我想知道SocketError.ConnectionReset
的可能原因是什么,如何处理我提到的这类问题?
我再次说,在正常环境中一切正常(例如,如果我退出客户端,它会断开与服务器相同的套接字(
提前谢谢。
编辑:
这是客户端中的代码。 实际上,它是一个计时器,在程序生命周期中每 3 秒滴答一次,并检查 Socket 是否已连接,如果它已断开连接,然后它会尝试通过新的套接字实例再次重新连接
private void timerSocket_Tick(object sender, EventArgs e)
{
try
{
if (sck == null || !sck.Connected)
{
ConnectToServer();
}
}
catch (Exception ex)
{
RPLog.WriteDebugLog("Exception occcured at: "+ System.Reflection.MethodBase.GetCurrentMethod().ToString()+"Message: "+ex.Message);
}
}
在正常情况下(没有网络断开连接/重新连接(,如果TCP服务器得到一个 SocketError.ConnectionReset 从任何客户端,在客户端我看到 客户端套接字已断开连接,并尝试再次重新连接 通过显示的代码。但是当情况发生时,前面解释过, 服务器收到套接字错误。连接重置,但客户端仍显示它 连接。尽管TCP服务器显示重置命令是从确切的客户端发送的 边。
有几个原因,但最常见的是你写信到一个已经关闭的连接,但他的另一端。换句话说,应用程序协议错误。当它发生时,你别无选择,只能关闭插座,它已经死了。但是,您可以解决根本原因。
在讨论这样的 TCP/IP 问题时,您必须提及客户端和服务器之间的网络详细信息。
当一端说连接已重置时,它只是意味着线路上出现了RST数据包。但是要知道谁发送RST数据包以及为什么发送,您必须利用网络数据包捕获(通过使用Wireshark和任何其他类似工具(,
https://en.wikipedia.org/wiki/Transmission_Control_Protocol
在.NET Framework级别,您不会轻易找出原因。
按原样使用 Socket.Connected 的问题在于,它只为您提供上次发送或接收操作时的已连接状态。 即,除非您首先尝试向其发送一些数据或从中接收数据,否则它不会告诉您套接字已断开连接。
从 MSDN 对 Socket.Connected 属性的说明:
获取一个值,该值指示套接字在上次发送或接收操作时是否连接到远程主机。
因此,在您的示例中,如果套接字在您上次发送或接收任何数据时套接字正常运行,则 timerSocket_Tick(( 方法永远不会调用 ConnectToServer((,即使套接字现在未连接也是如此。
如何处理我提到的这类问题?
关闭套接字并启动新连接。