我有一个使用标准套接字调用的C ++应用程序,我想知道是否可以判断套接字是否仍然打开而不发送或接收任何数据。我可以进行可靠的select
或ioctlsocket
来电吗?
答案 0 :(得分: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;
}
从return value of recv recv可以看出,可能会因断开连接而返回超时或其他几个错误,我相信WSAEWOULDBLOCK是唯一可能返回的值,如果出现错误但仍然连接,但您可能希望仔细检查返回值列表。 recv(MSG_PEEK)中使用的标志意味着当您在检查后再查看时数据仍然是可读的,因此您不必担心丢失一个字节的数据。
我相信这只适用于非阻塞套接字,因为它可能会阻塞,直到它收到数据。如果你想使用阻塞套接字,你可能希望在检查之前用ioctlsocket将其设置为非阻塞,然后将其恢复为原样。
答案 1 :(得分:3)
“开放”套接字无法帮助您实现端到端连接。确定你可以与另一端沟通的唯一方法就是与另一端沟通。
在您设计的任何协议中,您应该考虑实现此检查行为。如果它不是你的协议,有时可以偷偷摸摸地进行(例如FTP上传一个非常小的无用文件来检查FTP端口是否仍然打开)。