2

我有一个基于 TCP 套接字的客户端服务器系统。一切正常,但是当网络从客户端断开并重新连接时,我会自动SocketError.ConnectionReset发送表单客户端,并且关于此命令,套接字在服务器端关闭。这也很好。

但是当我查看客户端时,它显示套接字仍与服务器连接。(关于socket仍然与服务器连接[不是每次都发生],有时显示断开连接,有时显示连接)

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

4 回答 4

1

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

于 2013-07-29T22:07:23.210 回答
1

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

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

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

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

于 2013-07-30T07:25:48.040 回答
1

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

来自Socket.Connected 属性的 MSDN 描述:

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

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

于 2016-11-03T16:29:35.890 回答
0

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

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

于 2013-07-29T11:58:56.727 回答