我正在处理一个TcpClient异步请求WPF项目。我在其中编写了一些代码,当客户端断开连接时由于套接字断开而导致网络丢失。它工作正常,当在服务器端移除/拔出套接字时,没有事件被触发或没有收到异常以使客户端状态断开连接。我在许多网站上看到过这个问题,人们过去常常说使用Socket.Poll
方法,但在我的情况下不起作用。当客户端连接或断开连接时,SelectMode.SelectRead
始终返回true,因此我无法找到任何替代方法。
所以,我在这里发布我的问题,以了解如何在异步模式下拔出客户端套接字/网络访问时查找。我尝试过以下代码,不管它是如何工作的。
void CheckSocketStatus()
{
try
{
while (true)
{
System.Threading.Thread.Sleep(1000);
if(!mobjClient.Client.Poll(0,SelectMode.SelectWrite))
{
break;
}
}
}
catch(SocketException soex)
{
}
}
希望有人可以帮助我。
答案 0 :(得分:1)
这是正确的,这不能用于检测某些连接问题,如documentation所述:
此方法无法检测某些类型的连接问题,例如网络电缆损坏,或者远程主机无法正常关闭。您必须尝试发送或接收数据以检测这些类型的错误。
您应该考虑不依赖于持久连接,而是根据需要打开/关闭它。然而,如果您需要某种连接状态信息,不幸的结论是底层架构不能提供它。你必须通过定期交换数据包和捕获错误来做到这一点。
这也是TcpClient Connected属性的文档建议:
由于Connected属性仅反映最近操作时的连接状态,因此您应尝试发送或接收消息以确定当前状态。消息发送失败后,此属性不再返回true。请注意,此行为是设计使然。您无法可靠地测试连接状态,因为在测试和发送/接收之间的时间内,连接可能已丢失。您的代码应该假定套接字已连接,并正常处理失败的传输。