Только что ответил на тот же вопрос здесь , так что вот копия-паста в надежде, что это поможет:
Раньше вы могли вызвать WSAIsBlocking , чтобы определить это. Если вы управляете унаследованным кодом, это все еще может быть вариантом.
В противном случае вы можете написать простой слой абстракции поверх API сокета. Поскольку все сокеты по умолчанию блокируются, вы можете сохранить внутренний флаг и принудительно выполнить все операции сокетов через API, чтобы всегда знать состояние.
Вот кроссплатформенный фрагмент кода для установки / получения режима блокировки, хотя он не работает точно так, как вы хотите в Windows:
/// @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;
}