Re[5]: Вопросы по асинх. TCP серверу с пулом потоков (IOCP)
От: Jolly Roger  
Дата: 30.01.11 07:24
Оценка:
Здравствуйте, 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 возвратить может (это означает "потерю" клиента).

Теоретически это возможно и должно означать, что на часть данных от корреспондента получена квитанция, после чего связь была потеряна. Однако на практике я такого не встречал.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.