Здравствуйте, netch80, Вы писали:
JR>>Да, в случае синхронного неблокирующего режима.
N>Не только. В сокет пришло 5 килобайт, а вычитывается порциями по 2 килобайта. Сколько чтений на одну нотификацию надо сделать? Безусловно больше одного
JR>> А я рассматривал overlapped режим, автора топика ведь именно он интересует. Но Вы правы, следовало об этом явно сказать.
N>Угу, ещё и потому, что для асинхронного та же проблема. Или проверять, сколько ещё есть, в явных числах через что-то вроде FIONREAD, или долбиться до явного отказа.
Не понял

Читая по 2К, мы в случае синхронного неблокирующего режима получим EWOULDBLOCK на 4-й вызов.
В случае синхронного блокирующего 4-й вызов не завершится, пока либо не придут данные, либо не истечёт таймаут, либо не будет закрвто соединение. Ни в одном из этих случаев EWOULDBLOCK не будет возвращён.
В случае overlapped режима мы получим IO_PENDING. Далее, при приходе данных либо разрыве соединения к нам придёт уведомление об успешном завершении операции, либо код ошибки, соответствующий причине потери связи. EWOULDBLOCK к таким причинам не относится, и, соответственно, никогда в этом месте не возвращается.
В чём я не прав? Опишите сценарий, при котором WsaRecv вернёт ошибку в асинхронном (overlapped) режиме.