【问题标题】:socket disconnection notification method套接字断开通知方法
【发布时间】:2015-05-25 15:15:39
【问题描述】:

刚刚搜索了一个可行的解决方案,以在客户端断开连接时进行识别。 我发现了这个:

        public bool IsConnected( Socket s)
    {
        try
        {
            return !(s.Poll(1, SelectMode.SelectRead) &&s.Available == 0);
        }
        catch (SocketException) { return false; }
    }

我在我的 main 中使用 thread.sleep(500) 的 while 循环并运行 Isconnectedmthod 当我通过 Visual Studio 运行它时它工作正常,当我单击停止调试时它实际上在服务器端程序中通知我但是当我只是转到 bin 目录中的 exe 并启动它 - 它确实通知我连接但是当我关闭程序(手动从“x”按钮)或通过任务管理器时IsConnected 方法显然仍然返回 true ...... 我使用一个简单的 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 连接丢失的人。

标签: c# multithreading sockets disconnect


【解决方案1】:

你所要求的是不可能的。除非尝试在连接上发送,否则 TCP 不会报告连接错误。如果您的程序所做的只是接收,它将永远不会注意到连接不再存在。

此规则有一些依赖于平台的例外情况,但没有涉及远程端点的简单消失。

客户端断开连接的正确方法是通过“关闭”操作优雅地关闭连接。在 .NET 中,这意味着客户端代码调用 Socket.Shutdown(SocketShutdown.Send)。然后客户端必须继续接收,直到服务器调用Socket.Shutdown(SocketShutdown.Both)。请注意,关闭“原因”通常是“发送”用于发起关闭的端点,而“两者”用于确认和完成关闭的端点。

每个端点将通过以0 作为该操作的字节计数返回值的接收操作完成来检测另一个端点已关闭其端点。两个端点都不应该真正关闭套接字(即调用Socket.Close()),直到这个双向优雅关闭完成。 IE。每个端点都调用了Socket.Shutdown()并且看到了一个零字节接收操作完成。

以上是优雅闭包的工作原理,它应该是服务器/客户端交互的规范。当然,事情确实会破裂。客户端可能崩溃,网络可能断开等。通常,正确的做法是尽可能延迟对此类问题的识别;例如,只要服务器和客户端不需要实际通信,那么临时网络中断不应该导致错误。在这种情况下,强迫一个是没有意义的。

换句话说,不要添加代码来尝试检测连接失败。为了获得最大的可靠性,请让网络尝试自行恢复。

在一些不太常见的情况下,最好尽早检测到连接故障。在这些情况下,您可以在套接字上启用“保持活动状态”(强制通过连接发送数据,从而检测连接中的中断......请参阅SocketOptionName.KeepAlive)或实施一些超时机制(强制连接失败,如果一段时间后没有数据发送)。我一般会建议不要使用这种技术,但在某些情况下这是一种有效的方法。

【讨论】:

    猜你喜欢
    • 2019-03-05
    • 2023-03-19
    • 1970-01-01
    • 2011-05-14
    • 2014-04-08
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多