Здравствуйте, acDev, Вы писали:
D>Сейчаз же в HTTP сервере Overlapped структура одна на 1 сокет. Но сервак работает нормально, т.к. WSARecv вызывается после уведомления о выполненой WSASend. D>В MSDN написано что при "одновременном" запуске WSARecv/WSASend я должен использовать разные Overlapped структуры. D>Ну WSARecv я решил что будет в одном месте юзаться и поэтому использую для него ту структуру, что уже используется в контексте конкретного клиента. А вот под WSASend видимо придётся сделать отдельную структурку Overlapped. D>Я правильно понял?
Overlapped, точнее её адрес, — это "этикетка" асинхронного запроса, с её помощью и стек драйверов, и Ваш код отличают один такой запрос от другого. Естественно, её нельзя использовать повторно до завершения предыдущего запроса, в который Вы её передали, иначе Вы не сможете понять, на какой из запросов Вы получили уведомление о завершении.
JR>>Например, при попытке отправки смотрите, есть-ли незавершённые для данного сокета вызовы WsaSend.
D>Смотреть на счётчик вызовов WSASend для данного сокета?
Да, на индивидуальный для каждого гнезда счётчик, который Вы сами должны организовать и поддерживать в актуальном состоянии.
D>---------------------- D>Тут ещё вопросики созрели при использовании WSAxxxx в режиме IOCP (MSDN мало что дал): D>Что означает если WSARecv возвращает WSAEWOULDBLOCK ? D>Что означает если WSASend возвращает WSAEWOULDBLOCK ?
Она всегда означает одно — в данный момент система не может выполнить запрошенную операцию с этим экземпляром сокета, необходимо попробовать повторить её позже. На WSARecv получить её маловероятно, разве что в случае грубой ошибки в логике. А вот для WSASend это более вероятно, возникает при попытке передавать данные быстрее, чем стек реально может их отправить. Её легко сымитировать, вызвав два раза подряд WSASend с большим блоком данных, 1 МБ, например, при дефолтном размере буфера передачи.
D>Может ли WSASend возвратить в lpNumberOfBytesTransferred (параметр ф-ии GetQueuedCompletionStatus) число меньшее чем суммарный размер буферов переданных через параметр LPWSABUF lpBuffers ? D>Ну 0 возвратить может (это означает "потерю" клиента).
Теоретически это возможно и должно означать, что на часть данных от корреспондента получена квитанция, после чего связь была потеряна. Однако на практике я такого не встречал.