gpt4 book ai didi

c++ - 如何检查套接字是否仍处于打开状态?

转载 作者:可可西里 更新时间:2023-11-01 18:27:47 25 4
gpt4 key购买 nike

我有一个使用标准套接字调用的 C++ 应用程序,我想知道是否可以在不发送或接收任何数据的情况下判断套接字是否仍处于打开状态。我可以进行可靠的 selectioctlsocket 调用吗?

最佳答案

如果您尝试接收一个字节,您可能会收到多个错误,如果您有一个非阻塞套接字,并尝试在有效连接上接收,您将收到错误 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 将它设置为非阻塞。在此检查之前,然后将其恢复到原来的状态。

关于c++ - 如何检查套接字是否仍处于打开状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/851654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com