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