只是寻找一个可能的解决方案来识别客户端何时断开连接。
我找到了这个:
public bool IsConnected( Socket s)
{
try
{
return !(s.Poll(1, SelectMode.SelectRead) &&s.Available == 0);
}
catch (SocketException) { return false; }
}
我在主线程中使用了 while 循环 thread.sleep(500) 并运行 Isconnectedmthod 当我通过 Visual Studio 运行它时它工作正常,当我单击停止调试时它实际上在服务器端程序中通知我,但是当我去时到 bin 目录中的 exe 并启动它 - 它确实通知我连接,但是当我关闭程序(通过“x”按钮手动)或通过任务管理器时IsConnected
方法显然返回仍然正确......
我使用简单的 TCP 连接
client = new TcpClient();
client.Connect("10.0.0.2", 10);
server:
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 不会报告连接错误,除非尝试send在连接上。如果你的程序所做的只是接收,它永远不会注意到连接不再存在。
此规则有一些与平台相关的例外情况,但没有涉及远程端点的简单消失。
客户端断开连接的正确方法是通过“关闭”操作优雅地关闭连接。在 .NET 中,这意味着客户端代码调用Socket.Shutdown(SocketShutdown.Send)
。然后客户端必须继续接收,直到服务器调用Socket.Shutdown(SocketShutdown.Both)
。请注意,对于发起关闭的端点,关闭“原因”通常是“发送”,对于确认并完成关闭的端点来说,关闭“原因”通常是“两者”。
每个端点将通过完成接收操作来检测另一个端点已关闭其端点0
作为该操作的字节计数返回值。两个端点实际上都不应该close套接字(即调用Socket.Close()
)直到双向优雅关闭完成。 IE。每个端点都被调用Socket.Shutdown()
and看到零字节接收操作完成。
以上就是优雅关闭的工作原理,它应该成为服务器/客户端交互的规范。当然,事情确实会破裂。客户端可能会崩溃,网络可能会断开等。通常,正确的做法是尽可能延迟识别此类问题;例如,只要服务器和客户端不需要实际通信,那么临时网络中断就不会导致错误。在这种情况下,强迫一个人是没有意义的。
换句话说,不要添加代码来尝试检测连接失败。为了获得最大的可靠性,让网络尝试自行恢复。
在一些不太常见的情况下,希望尽早检测到连接故障。在这些情况下,您可以在套接字上启用“保持活动”(强制通过连接发送数据,从而检测连接中断......请参阅SocketOptionName.KeepAlive)或实现某种超时机制(如果在一段时间后没有发送数据,则强制连接失败)。我通常建议不要使用这种技术,但在某些情况下这是一种有效的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)