ベアwinsock2上にC++で構築された、動作するマルチクライアント、シングルスレッドのTCP/IPサーバーアプリケーションがあります。その中心はselect()
、新しい作業が行われるのを待つために使用されます。同時クライアントの数を数百または数千に拡張することを考えていますが、実際にはほとんどアイドル状態です。私のアーキテクチャは、接続されたアイドル状態のクライアントにほとんどメモリを使用しません。
それぞれの前に、読み取り状態のクライアントソケットと、リスニングソケット(新しい接続を受け入れるため)select()
を構築します。書き込み状態のfd_set
別のソケット。fd_set
次に、select()
これらをスキャンして、ソケット番号から、どのクライアントを対象としていたかを再構築します。このfd_set
構築とスキャンは、客観的には現在のCPUのボトルネックではありませんが、私を不安にさせます。トランザクションあたりの作業量は、クライアントの数に比例して増加します。でデフォルトの64ソケットの制限を超える方法はわかりますが、fd_set
そのルートを使用するのは気が進まないです。
2つのスレッドを使用する方法が漠然とわかります。1つは最もアクティブな少数のクライアントを処理し、もう1つはアイドル状態のクライアントの大部分を処理します。それは実行可能に思えますが、少し複雑です。
select()
だから: winsock2の下に代わるものは何ですか?