Я использую синхронный запрос wininet и вызываю InternetReadFileEx() с флагом IRF_NO_WAIT, но функция все еще блокирует ожидание данных. Почему это так?
InternetReadFileEx()
IRF_NO_WAIT
В MSDN документах значение IRF_NO_WAIT описывается следующим образом:
Не ждите данных.Если данные доступны, функция возвращает либо объем запрошенных данных, либо объем доступных данных (в зависимости от того, что меньше).
Таинственным образом выходит из случая, когда не данные доступны неопределенные.Очевидно, что если нет данных, они блокируются, пока их не будет.
Возможный обходной путь - использовать InternetQueryOption () для получения структуры INTERNET_DIAGNOSTIC_SOCKET_INFO, а затем передать дескриптор SOCKET в :: select () с таймаутом {0, 0}, чтобы определить, доступны ли данные без блокировки.
Что означает IRF_NO_WAIT, так это не ждать, пока все запрошенного буфера данных будут заполнены. Однако он все еще будет ожидать поступления некоторых данных. Если данные не поступают, они блокируются.