如何检查套接字是否仍然打开?

Rob*_*Rob 7 c++ sockets

我有一个使用标准套接字调用的C++应用程序,我想知道是否可以判断套接字是否仍然打开而不发送或接收任何数据.我能做出可靠selectioctlsocket致电吗?

Owe*_*hoy 7

如果你试图接收一个字节,你可以收到几个错误,如果你有一个非阻塞套接字,并尝试接收有效连接,你将收到错误WSAEWOULDBLOCK.

知道了这一点,我们可以像这样检查非阻塞套接字

bool connected(SOCKET sock)
{
     char buf;
     int err = recv(sock, &buf, 1, MSG_PEEK);
     if(err == SOCKET_ERROR)
     {
          if(WSAGetLastError() != WSAEWOULDBLOCK)
          {return false;}
     }
     return true;
}
Run Code Online (Sandbox Code Playgroud)

正如你从recv recv 的返回值中看到的那样,可以返回一个超时或其他几个错误断开连接,我相信WSAEWOULDBLOCK是唯一可以返回的值,如果有错误但仍然连接,但你可能想要仔细检查该列表返回值.此外,recv(MSG_PEEK)中使用的标志意味着当您在检查后再查看时数据仍然是可读的,因此您不必担心丢失一个字节的数据.

我相信这只适用于非阻塞套接字,因为它可能会阻塞直到它接收数据.如果你想使用阻塞套接字,你可能希望在检查之前使用ioctlsocket将其设置为非阻塞,然后将其恢复为原样.