Лично я бы предложил, чтобы вы использовали дизайн на основе IOCP, но потом я бы сказал, что, поскольку у меня есть основанная на IOCP структура , которую я использовал годами для разработки высокопроизводительных серверов для клиентов.
Недавно я собрал некоторые из причин, по которым IOCP предпочел другие модели, доступные в Windows, и они доступны здесь, в моем блоге здесь .
Часто «сложность» указывается в качестве причины, позволяющей избежать IOCP, но, если честно, если вы делаете что-то кроме «потока на соединение», код в любом случае будет достаточно сложным. У меня есть бесплатный набор кода C ++ с примерами серверов , на который вы могли бы взглянуть, он выполняет всю работу IOCP за вас, и примеры серверов являются хорошей отправной точкой для вашего собственного кода. Вы можете получить его у здесь .
В качестве альтернативы у меня также есть бесплатная (для некоммерческого использования) сменная серверная платформа, которая может вас заинтересовать. С WASP вы просто пишете dll с некоторыми конкретными точками входа, и я делаю все сетевые вещи для вас ... Смотрите здесь для загрузки и здесь для учебника.
Какую бы модель вы ни выбрали, ЕДИНСТВЕННАЯ и самая важная вещь, ИМХО, состоит в том, чтобы начать выполнять тестирование производительности и нагрузки с 0 ДНЯ. Таким образом, вы ЗНАЕТЕ, сколько одновременных соединений вы можете поддерживать на целевом оборудовании, и вы можете быстро определить неуместные дизайнерские решения, которые вызывают это падение. Это легко расточить параллелизм вашего сервера. См. здесь для получения дополнительной информации.
Поскольку Джей упомянул ENet ... Я обнаружил, что наш ENet-сервер на базе IOCP хорошо работает со стандартным клиентским кодом Enet. Но помните, ENet разработан, чтобы быть одноранговым протоколом, и поэтому есть некоторые проблемы, когда вы начинаете пытаться использовать его на сервере. Со стандартным кодом ENet у вас, по сути, однопоточный сетевой насос, который просто не может сравниться с масштабируемостью, которую вы получаете от IOCP. В итоге я переписал код обработки протокола ENet с нуля, чтобы работать с асинхронным вводом-выводом и IOCP, и это нетривиальный объем работы. В настоящее время я делаю новую версию этого кода, в которой в качестве основы используется последний протокол ENet, и, надеюсь, он будет доступен в начале 2011 года с полным сравнением производительности со стандартным кодом ENet, используемым в большом количестве одновременных ситуаций сервера соединений.