我有一个基于TCP套接字的客户端服务器系统。一切正常,但是当网络断开、从客户端重新连接时,我会自动获得SocketError.ConnectionReset发送表单客户端,对于这个命令,套接字在服务器端关闭。这也没问题。
但是当我查看客户端时,它显示套接字仍然与服务器连接。(关于套接字仍然与服务器连接,它不是每次都发生,有时显示断开连接,有时显示已连接)
“服务器从客户端获得
SocketError.ConnectionReset,但客户端仍然连接”,这是否合理?
因此,我想知道SocketError.ConnectionReset的可能原因是什么,以及如何处理我提到的这类问题?
我再说一遍,在正常环境下,一切都很正常(例如,如果我退出客户端,就会断开服务器的套接字)。
提前谢谢。
编辑:
这是客户端的代码。实际上,它是一个计时器,每3秒在程序生存期内滴答一次,检查套接字是否已连接,是否断开,然后尝试通过新的套接字实例重新连接
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服务器显示重置命令是从确切的客户端发送的。
发布于 2013-07-29 22:07:23
有几个原因,但最常见的是,你已经写到一个连接已经关闭,但他的另一端。换句话说,应用程序协议错误。当它发生时,你别无选择,只能关闭插座,它已经死了。但是,您可以修复根本原因。
发布于 2013-07-30 07:25:48
在讨论这样的TCP/IP问题时,您必须提到客户端和服务器之间的网络细节。
当一方说连接被重置时,这仅仅意味着在线路上会出现一个RST数据包。但是要知道谁发送RST数据包以及为什么,您必须利用网络数据包捕获(通过使用Wireshark和其他类似工具),
在.NET框架级别上,您将很难找到原因。
发布于 2016-11-03 16:29:35
按原样使用Socket.Connected的问题是,它只在最后一次发送或接收操作时给出连接状态。也就是说,它不会告诉您套接字已经断开,除非您首先尝试向它发送一些数据或从它接收数据。
获取一个值,该值指示套接字是否在上次发送或接收操作时连接到远程主机。
因此,在您的示例中,如果套接字上次发送或接收任何数据时运行正常,那么timerSocket_Tick()方法将永远不会调用ConnectToServer(),即使套接字现在没有连接。
https://stackoverflow.com/questions/17923191
复制相似问题