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

Zac*_*Zac 4 c# sockets

我一直在使用C#中的套接字客户端程序,并且想知道如何检测套接字的另一端何时"不正常"地断开连接,就像拔出网络电缆或硬重置一样.

我在下面有这些函数来访问套接字,根据这里的SO问题和这篇MSDN文章,检查断开连接套接字的最佳方法是发送长度为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;
}
Run Code Online (Sandbox Code Playgroud)

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

Ank*_*kit 6

如果远程计算机正常断开会话连接,则该 Socket.Receive()方法将返回0字节.您必须检测到该信息才能知道远程端已断开连接:

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

此外,即使SocketException出现这种情况,您也可以识别套接字断开的异常.

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