Я не уверен, о чем ты говоришь: сокет или дескриптор файла?
Для файлов не должно быть блокировок. Функция немедленно возвращается (кроме самого вызова I / O).
Для сокетов - вы можете использовать функцию ioctlsocket
:
Следующее говорит, есть ли ожидающие данные rcv:
ULONG nSize;
ioctlsocket(sock, FIONREAD, &nSize);
Следующее переводит сокет в неблокирующий режим:
ULONG nEnable = 1;
ioctlsocket(sock, FIONBIO, &nEnable);
В неблокирующем режиме - функции на сокете никогда не блокируются. Если они не могут выполнить запрос, они возвращают ошибку, и код ошибки WSAEWOULDBLOCK
Кроме того, в Windows существуют десятки гораздо более эффективных методов. Это:
- Использование перекрывающегося ввода-вывода. Это нетривиально, но дает превосходную производительность
- Связывание сокета с ожидаемым событием. Это переводит сокет в неблокирующий режим, плюс указанное событие сигнализируется, когда происходит сетевое событие.
- Свяжите это с дескриптором окна. Это удобно для программ, ориентированных на пользовательский интерфейс.