Существует четыре основных способа обработки нескольких одновременных сокетов.
- Мультиплексирование, которое использует select () для опроса сокетов.
- AsyncSelect, который в основном то, что вы делаете с WSAAsyncSelect.
- Рабочие потоки, создавая отдельный поток для каждого соединения.
- Порты завершения ввода-вывода или IOCP. dp упоминает их выше, но в основном это специфический для ОС способ обработки асинхронного ввода-вывода, который имеет очень хорошую производительность, но это немного запутывает.
То, что вы выбираете, часто зависит от того, куда вы планируете пойти. Если вы планируете портировать приложение на другие платформы, вы можете выбрать # 1 или # 3, поскольку select не сильно отличается от других моделей, используемых в других ОС, и большинство других ОС также имеют концепцию потоков (хотя они могут действовать по-другому). IOCP, как правило, специфичен для Windows (хотя в Linux теперь также есть некоторые функции асинхронного ввода-вывода).
Если ваше приложение предназначено только для Windows, то вы в основном хотите выбрать лучшую модель для того, что вы делаете. Скорее всего, это будет №3 или №4. # 4 является наиболее эффективным, так как он вызывает обратно в ваше приложение (похоже, но с лучшей производительностью и меньшим количеством проблем для WSAsyncSelect).
Важной вещью, с которой вам приходится иметь дело при использовании потоков (IOCP или WorkerThreads), является маршалинг данных обратно в поток, который может обновлять пользовательский интерфейс, поскольку вы не можете вызывать функции пользовательского интерфейса в рабочих потоках. В конечном счете, это будет связано с обменом сообщениями в большинстве случаев.
Если бы вы разрабатывали это в управляемом коде, я бы посоветовал вам взглянуть на AysncEnumerator Джеффри Рихтера, но вы выбрали C ++, у которого есть свои плюсы и минусы. Многие люди написали различные сетевые библиотеки для C ++, может быть, вам стоит потратить некоторое время на изучение некоторых из них.