使用 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 标志来防止实际消耗任何未决数据。
我正在寻找一种方法来验证对等点是否仍连接到 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 标志来防止实际消耗任何未决数据。