使用 WinSock 检查对等点是否仍连接到非阻塞套接字 2.x

Checking if a peer is still connected to a non-blocking socket with WinSock 2.x

我正在寻找一种方法来验证对等点是否仍连接到 TCP 非阻塞套接字(服务器),我有以下代码:

Is_Client_Connected(SOCKET *s)
{

    struct sockaddr name;
    INT32 name_len = sizeof(name), retval;
    retval = getpeername(*s, &name, &name_len);
    if (retval == SOCKET_ERROR && WSAGetLastError() == WSAENOTCONN)
    {
        return FALSE;
    }
    return TRUE;
}

但出于某种原因,当我使用它并且客户端与服务器断开连接时,getpeername() return没有套接字错误 - 相反它 return 0(成功)。

我意识到这个 getpeername() 可能不是我正在寻找的函数,但我查看了 WinSock 参考资料,但找不到适合我目的的任何东西。

你的期望是毫无根据的。 此套接字 仍处于打开和连接状态,那么为什么getpeername() 会失败?您期望的行为描述在哪里?

正确 检测完全断开连接的方法是尝试从套接字读取。如果 recv() returns 为零,则对等方已关闭连接。阳性结果表示数据待处理; SOCKET_ERROR 的结果表示某种错误,不一定表示连接失败。您可以使用 MSG_PEEK 标志来防止实际消耗任何未决数据。