c#套接字-如何检查客户端是否断开连接

本文关键字:客户端 是否 断开 连接 检查 套接字 何检查 | 更新日期: 2023-09-27 18:12:04

我正在制作一个小程序,我正在尝试处理客户端断开连接。当客户端断开连接时,他发送一个关闭消息,由我来处理。但是当客户端被强制关闭时(网络连接丢失,任务终止,异常…)服务器仍然认为客户端已连接。现在,我正在尝试立即更新此信息,一旦客户端不再连接,他应该被删除。我总不能只是时不时地联系他吧?如果有正在进行的传输,而我干扰了我的ping命令怎么办?

我如何知道我的客户端是否不再连接?

c#套接字-如何检查客户端是否断开连接

当套接字优雅关闭时,您将收到关闭消息(从读取尝试返回零字节)…好时光!

如果远程任务被杀死并且套接字没有优雅地关闭(或其他一些客户端离开但服务器仍在侦听的场景),则有"半打开的套接字"。根据不同的场景,检测这些可能会很棘手。TCP有一个keep-alive机制,应该检测到这一点(主要是在非移动网络上,如果它们是启用的)。对于移动连接(特别是不可靠的GPRS/Edge),你会发现即使是keep-alive也不总是有效,任何发送数据的尝试都只是返回成功。在这种情况下,如果客户端没有向您发送任何数据,您应该基于自动超时建立有效连接…当然,总有这样的情况,客户端试图重新连接,但你似乎已经有一个套接字坐在那里

试试这个。

private static bool IsSocketConnected(Socket socket)
{
    try
    {
        return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0);
    }
    catch (SocketException) { return false; }
}