套接字断开通知方法
本文关键字:方法 通知 断开 套接字 | 更新日期: 2023-09-27 17:50:37
只是寻找一个可能的解决方案来确定客户端何时断开连接。我发现了这个:
public bool IsConnected( Socket s)
{
try
{
return !(s.Poll(1, SelectMode.SelectRead) &&s.Available == 0);
}
catch (SocketException) { return false; }
}
我在我主要使用while循环运行Isconnectedmthod thread . sleep(500)和它的工作原理通过visual studio还好吧当我运行它,当我点击停止调试它实际上在服务器端程序通知我当我刚去exe确实遗失bin目录并启动的通知我联系但是当我关闭程序从"x"按钮(手动)或通过任务管理器仍然IsConnected
方法显然返回正确…我使用一个简单的TCP连接
client = new TcpClient();
client.Connect("10.0.0.2", 10);
服务器:Socket s = tcpClient.Client;
while(true)
{
if (!IsConnected(s))
MessageBox.Show("disconnected");
}
(它正在一个线程上运行)。
有什么建议吗?我甚至试图在客户端关闭时关闭连接: private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
client.Close();
s.Close();
Environment.Exit(0);
}
不知道该怎么做
你所要求的是不可能的。TCP不会在连接上报告错误,除非在连接上尝试发送。如果你的程序所做的只是接收,它永远不会注意到连接已经不存在了。
此规则有一些平台相关的异常,但没有一个涉及到远程端点的简单消失。
客户端断开连接的正确方法是使用"shutdown"操作优雅地关闭连接。在。net中,这意味着客户端代码调用Socket.Shutdown(SocketShutdown.Send)
。客户端必须继续接收,直到服务器调用Socket.Shutdown(SocketShutdown.Both)
。请注意,对于发起关闭的端点,关闭"原因"通常为"发送",对于确认并完成关闭的端点,关闭"原因"为"两者"。
每个端点将检测到另一个端点已关闭其端,通过完成接收操作,0
作为该操作的字节计数返回值。在此双向优美闭包完成之前,两个端点都不应该实际关闭套接字(即调用Socket.Close()
)。即,每个端点都调用了Socket.Shutdown()
和,看到了一个零字节的接收操作完成。
以上就是优美闭包的工作原理,它应该成为服务器/客户端交互的标准。当然,东西确实会坏。客户端可能崩溃,网络可能断开,等等。通常情况下,正确的做法是尽可能推迟对此类问题的认识;例如,只要服务器和客户机不需要实际通信,那么暂时的网络中断应该不会导致错误。在这种情况下,强迫一个是没有意义的。
换句话说,不要添加试图检测连接失败的代码。为了获得最大的可靠性,让网络自己尝试恢复。
在一些不太常见的情况下,希望更早地检测连接故障。在这些情况下,您可以在套接字上启用"keep alive"(强制通过连接发送数据,从而检测连接中的中断&参见SocketOptionName.KeepAlive
)或实现一些超时机制(如果一段时间后没有发送数据,则强制连接失败)。我一般不建议使用这种技术,但在某些情况下这是一种有效的方法。