我有一个基于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服务器显示重置命令是从确切的客户端发送 侧。
答案 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)
如何处理我提到的这类问题?
关闭套接字并启动新连接。