Re: Вопросы по асинх. TCP серверу с пулом потоков (IOCP)
От: Jolly Roger  
Дата: 29.01.11 07:01
Оценка:
Здравствуйте, 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'ы ?

Я так не думаю.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.