以前,您可以拨打WSAIsBlocking来确定这一点。如果您正在管理遗留代码,这可能仍然是一个选项。
否则,您可以在套接字API上编写一个简单的抽象层。由于所有套接字默认都处于阻塞状态,因此您可以维护一个内部标志并通过API强制所有套接字操作,以便始终了解状态。
这里是一个跨平台的代码段设置/获取阻塞模式,虽然它不会做你想要什么:
/// @author Stephen Dunn
/// @date 10/12/15
bool set_blocking_mode(const int &socket, bool is_blocking)
{
bool ret = true;
#ifdef WIN32
/// @note windows sockets are created in blocking mode by default
// currently on windows, there is no easy way to obtain the socket's current blocking mode since WSAIsBlocking was deprecated
u_long flags = is_blocking ? 0 : 1;
ret = NO_ERROR == ioctlsocket(socket, FIONBIO, &flags);
#else
const int flags = fcntl(socket, F_GETFL, 0);
if ((flags & O_NONBLOCK) && !is_blocking) { info("set_blocking_mode(): socket was already in non-blocking mode"); return ret; }
if (!(flags & O_NONBLOCK) && is_blocking) { info("set_blocking_mode(): socket was already in blocking mode"); return ret; }
ret = 0 == fcntl(socket, F_SETFL, is_blocking ? flags^O_NONBLOCK : flags | O_NONBLOCK);
#endif
return ret;
}
如果我接受()的连接,并在新的套接字继承监听套接字的非阻塞状态? – 2011-04-01 17:00:29