Здравствуйте, my_problem, Вы писали:
Вот эта строчка для чего ?
WaitForSingleObject(0, 50000);
_>Если я правильно понимаю, я делаю их не блокируемыми и в цикле проверяю, в каком из них на данный момент времени есть данные (клиент или сервер), и читая с этого сокета — отправляю в "противоположный".
Цикл — это тоже не хорошо (ну что за собеседник, скажете, — и это ему не хорошо, и то)...
Представьте себе 50 потоков, в каждом из которых крутится цикл, причем только для того,
чтобы проверить — пришли ли данные. Суть асинхронных операций в Windows в том, чтобы
отдать данные и забыть о них на время. Например, поспать [часок] в wait-функции или заняться
другой полезной работой. Когда инфраструктура завершит операцию, она даст сигнал и
результаты можно будет забрать. Для Windows это наиболее эффективная схема.
Есть такая книга — "Программирование в сетях Windows" от Э.Джонса и Д.Оланда.
В ней довольно подробно рассматриваются основные модели работы с сокетами — select,
перекрытый ввод-вывод, порты завершения, и другие. Рекомендую найти и прочесть.