個人的には、IOCP ベースの設計を使用することをお勧めしますが、クライアント用の高性能サーバーを開発するために何年も使用してきた IOCP ベースのフレームワークを使用しているので、それをお勧めします。
私は最近、Windows で利用可能な他のモデルよりも IOCP を好む理由のいくつかをまとめました。
多くの場合、「複雑さ」は IOCP を回避する理由として挙げられますが、正直なところ、「接続ごとのスレッド」以外のことをしている場合、コードはとにかくかなり複雑になります。サンプル サーバーを含む C++ コードの無料セットを用意しています。これは、すべての IOCP 作業を行います。サーバーのサンプルは、独自のコードの出発点として適しています。ここから入手できます。
また、無料の (非営利目的の) プラグ可能なサーバー プラットフォームもあります。興味があるかもしれません。WASP を使用すると、いくつかの特定のエントリ ポイントを含む dll を作成するだけで、ネットワーク関連の作業はすべて私が行います。ダウンロードについてはこちらを、チュートリアルについてはこちらを参照してください。
最も重要なことである IMHO でどのモデルを決定する場合でも、DAY 0 からパフォーマンスと負荷のテストを開始することです。これにより、ターゲット ハードウェアでサポートできる同時接続数を把握し、不適切な設計上の決定をすばやく見つけることができます。これが落ちる原因です。サーバーの同時実行性を浪費するのは簡単です。詳細については、こちらを参照してください。
Jay が ENet について言及して以来、私は、IOCP ベースの ENet サーバーが標準の Enet クライアント コードでうまく機能することを発見しました。ただし、ENet はピア ツー ピア プロトコルとして設計されているため、サーバーで使用しようとするといくつかの課題があることに注意してください。標準の ENet コードでは、基本的に単一のスレッド化されたネットワーク ポンプがあり、IOCP から得られるスケーラビリティと比較することはできません。ENet プロトコル処理コードを最初から書き直して、非同期 I/O と IOCP で動作するようにしましたが、これは重要な作業量です。私は現在、最新の ENet プロトコルをベースとして使用するこのコードの新しいバージョンを作成しています。うまくいけば、2011 年初頭に利用可能になり、多数の同時接続サーバーの状況で使用される標準の ENet コードとの完全なパフォーマンス比較が可能になります。