Здравствуйте, acDev, Вы писали:
D>Т.е. эта реализация обеспечивает протокол обмена типа: acceptEx -> получили запрос -> отправили ответ -> ждём запрос...
D>У меня же протокол совсем не HTTP. У меня клиент может послать пакет серверу и при этом сервер не обязан на него отвечать. Да и сервер посылает клиенту команды, которые не требуют подтверждения.
D>Вот и не знаю как этот HTTP сервер передалать под мой протокол.
Ну и в чём трудность? Получили пакет, обработали. Если требуется ответ, отправляете его вызовом WsaSend, иначе вызываете WsaRecv
D>Да и не знаю как в этом сервере из любого другого потока в любой момент времени послать "моментально" данные клиенту.
D>Да и можно ли использовать один и тот же сокет в разных потоках "одовременно"?
D>Обязательно ли дожидаться окончания выполнения WSASend что бы вызвать WSARecv?
Нет.
И наоборот?
Тоже нет. Но вот с одновременным вызовом нескольких WsaSend или WsaRecv не столь однозначно, и дело даже не в потокобезопасности самих функций, с этим в асинхронном режиме всё в порядке. Трудности в логике обработки уведомлений о завершении. Например, если у Вас будет несколько активных запросов на чтение из одного сокета, то может статься, что уведомление о получении разных частей одного пакета Вы получите в разных потоках, и сборка такого пакета в единое целое может оказаться делом нетривиальным. И зачем оно? С несколькими WsaSend тоже есть проблема. Допустим, у Вас 10 потоков одновременно вызывают WsaSend. Достаточно высока вероятность, что несколько из них завершатся с ошибкой WSAEWOULDBLOCK, и для разруливания такой ситуации Вам всё равно придётся организовать ассоциированную с сокетом очередь отправки. На мой взгляд проще и надёжней сразу организовать такую очередь из структур WSABUF, и при получении уведомления о завершении WsaSend проверять её.
D>Ещё читал что, перекрытый ввод-вывод лучше подходит для обмена в режиме "запрос-ответ" (HTTP сервер). Т.е. в моём случае, когда инициатором может выступать и сервер, лучше какую "конструкцию" сервера выбрать?
D>Может стоит посмотреть в сторону перекрытого ввод-вывода, реализованого через Event'ы ?
Я так не думаю.