c# - 如何检测断开连接的套接字 C#?

标签 c# sockets

我一直在使用 C# 编写套接字客户端程序,想知道如何检测套接字的另一端何时“不正常地”断开连接,例如拔下网络电缆或硬重置。

根据 SO 问题 here,我在下面有这些函数来访问套接字还有这个MSDN article ,检查断开连接的套接字的最佳方法是发送长度为 0 的 1 字节消息。如果抛出异常并且 WSAEWOULDBLOCK 不是错误代码,则套接字断开连接。我试过这个但是在硬重置服务器连接后,客户端将调用 Send(new byte[1], 0, 0, SocketFlags.None) 并成功返回并且 Receive() 命令立即返回 WSAEWOULDBLOCK 错误。

什么给了??

下面是我的代码。 _socket 设置为非阻塞模式:

private int nonBlockRecv(byte[] recvBytes, int offset, int size, SocketFlags sf)
{
    int bytesRecv = 0;

    while (true)
    {
        try
        {
            nonBlockSend(new byte[1], 0, 0, sf);
            bytesRecv = _socket.Receive(recvBytes, offset, size, sf);
            break;
        }
        catch (SocketException excp)
        {
            if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
                throw excp;
        }
    }

    return bytesRecv;
}

private int nonBlockSend(byte[] sendBytes, int offset, int size, SocketFlags sf)
{
    int bytesSent = 0;

    while (true)
    {
        try
        {
            _socket.Send(sendBytes, offset, size, sf);
            break;
        }
        catch (SocketException excp)
        {
            if (excp.ErrorCode != 10035) // WSAEWOULDBLOCK
                throw excp;
        }
    }

    return bytesSent;
}

编辑:这可能是有益的,但服务器是 Windows Mobile 设备。我在另一个线程中读到,不同的操作系统可能会在它们快要死的时候发送套接字关闭信号。也许 Windows Mobile 操作系统不这样做??

最佳答案

如果远程计算机优雅地断开 session ,则 Socket.Receive() 方法将返回 0 字节。你必须检测到 知道远程端已断开连接:

int recv = sock.Receive(data);
if (recv == 0)
{
    // Remote client has disconnected.
}
else
{
    // Remote client has sent data.
}

此外,即使出现SocketException,您也可以识别套接字断开的异常。

希望这有助于解决您的问题。

关于c# - 如何检测断开连接的套接字 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680500/

相关文章:

java - 套接字编程

c# - socket 推荐

c# - GetCustomAttributes 继承参数与 AttributeUsage.Inherited

c# - 公共(public)类,但私有(private)成员变量?

c# - 将编号的音乐节点放入 RichTextBox

java - 简单的 TCP 客户端-服务器应用程序抛出异常

c# - IIS 快速访问被拒绝

c# - 合并两个程序并使用 1 的输出作为另一个程序的输入

java - TCP-服务器不会打印/接收来自远程客户端的数据

用于与 IRC 服务器通信的 Java 套接字