套接字断开通知方法

本文关键字:方法 通知 断开 套接字 | 更新日期: 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)或实现一些超时机制(如果一段时间后没有发送数据,则强制连接失败)。我一般不建议使用这种技术,但在某些情况下这是一种有效的方法。