查找TcpClient由于网络丢失而断开连接的问题

本文关键字:断开 连接 问题 TcpClient 于网络 网络 查找 | 更新日期: 2023-09-27 18:25:00

我正在处理一个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)
        {
        }
    }

希望有人能帮我。

查找TcpClient由于网络丢失而断开连接的问题

正确的是,这不能用于检测某些连接问题,正如文档中所述:

这种方法无法检测到某些类型的连接问题,例如网络电缆断开,或者远程主机未正常关闭。您必须尝试发送或接收数据以检测这些类型的错误。

您可能应该考虑不依赖持久连接,而是根据需要打开/关闭它。然而,如果你需要某种连接状态信息,不幸的结论是底层架构没有提供。你必须通过定期交换数据包和捕获错误来实现。

这也是TcpClient的Connected属性文档所建议的:

由于Connected属性仅反映最近操作时的连接状态,因此应尝试发送或接收消息以确定当前状态。消息发送失败后,此属性将不再返回true。请注意,这种行为是故意的。您无法可靠地测试连接的状态,因为在测试和发送/接收之间的时间内,连接可能已丢失。您的代码应该假定套接字已连接,并优雅地处理失败的传输。