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

时间:2013-07-29 11:47:34

标签: c# sockets

我有一个基于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形成任何客户端,在客户端我看到   客户端套接字已断开连接,并尝试再次重新连接它   通过显示的代码。但是当情况发生在前面解释时,   服务器获取SocketError.ConnectionReset但客户端仍显示它   连接的。虽然TCP服务器显示重置命令是从确切的客户端发送   侧。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

当一方说连接被重置时,它只是意味着在线上会出现RST数据包。但要知道谁发送RST数据包及其原因,您必须利用网络数据包捕获(使用Wireshark和任何其他类似工具),

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

您不会轻易找到.NET Framework级别的原因。

答案 2 :(得分:1)

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

来自MSDN description of the Socket.Connected property:

  

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

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

答案 3 :(得分:0)

  

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

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