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服务器显示重置命令是从确切的客户端发送的 边。

SocketError.ConnectionReset in TCP Socket的可能原因是什么

有几个原因,但最常见的是你写信到一个已经关闭的连接,但他的另一端。换句话说,应用程序协议错误。当它发生时,你别无选择,只能关闭插座,它已经死了。但是,您可以解决根本原因。

在讨论这样的 TCP/IP 问题时,您必须提及客户端和服务器之间的网络详细信息。

当一端说连接已重置时,它只是意味着线路上出现了RST数据包。但是要知道谁发送RST数据包以及为什么发送,您必须利用网络数据包捕获(通过使用Wireshark和任何其他类似工具(,

https://en.wikipedia.org/wiki/Transmission_Control_Protocol

在.NET Framework级别,您不会轻易找出原因。

按原样使用 Socket.Connected 的问题在于,它只为您提供上次发送或接收操作时的已连接状态。 即,除非您首先尝试向其发送一些数据或从中接收数据,否则它不会告诉您套接字已断开连接。

从 MSDN 对 Socket.Connected 属性的说明:

获取一个值,该值指示套接字在上次发送或接收操作时是否连接到远程主机。

因此,在您的示例中,如果套接字在您上次发送或接收任何数据时套接字正常运行,则 timerSocket_Tick(( 方法永远不会调用 ConnectToServer((,即使套接字现在未连接也是如此。

如何处理我提到的这类问题?

关闭套接字并启动新连接。