0

接続を待機している専用スレッドでブロックするだけでなく、BeginAccept を使用することでスケーラビリティの利点が得られるかどうかを考えようとしていました。明らかに、個々のクライアントはネットワーク IO に IOCP を利用するために BeginXXX/EndXXX ペアを使用しますが、クライアント接続の待機時間は非常に短いはずだと思います。着信接続を処理する Task を作成する予定なので、Accept が完了した後のフォローアップ コードは、メインの受け入れスレッドを非常に長い間ブロックせず (Task オブジェクトを作成するのに十分な時間)、すぐにブロックに戻ることができます。新しい接続について。これは、非同期呼び出しを管理する複雑さなしに、BeginAccept/EndAccept のみで行うこととほとんど同じです。

ですから、私の質問は、受け入れに IOCP を使用することで得られるスケーラビリティの利点があるとすれば、それは何ですか? これは、個々のクライアント ソケットでの送受信用ではなく、サーバー リッスン ソケットでの接続の受け入れ用であることに注意してください。

4

1 に答える 1

4

リッスンしているポートが 1 つしかない場合は、おそらく価値がありません。一度に少数の接続しか処理する必要がない場合と同様に、それらを処理するために非同期操作を使用する必要はないかもしれません。

非同期のサーバー側の利点は、通常、スケールアップするときです。接続を処理する場合は、多くの接続を取得するときです。それはBeginAccept、多くの異なるポートでリッスンしている場合です。それはおそらくまれですが、 100 の異なるポートをリッスンたい場合 (たとえば、1 つのサーバーで多数の Web サイトをホストしていて、何らかの理由でホスト ヘッダーを使用する代わりに異なるポートでリッスンしたい場合) は、必要ありません。スタックスペースを消費するだけで100個のスレッドが必要です。

于 2013-03-01T20:21:29.487 に答える