アプリケーションがサーバーへの複数のソケット接続 (約 1000 接続) を起動するシミュレーター アプリケーションを設計しています。システムはそれほど多くのクライアントを処理できないため、これらの接続を処理するためにできるだけ多くのスレッドを起動したくありません。Select を使用しても意味がありません。遅い可能性がある 1000 の接続をループする必要があるためです。このシナリオを処理する方法を教えてください。
2 に答える
I / O完了ポート(IOCP)で非同期I/Oを使用する必要があります。
簡単に説明するのは多すぎますが、多数の同時ソケットをサポートする必要があるWindowsアプリケーションは、IOCPを使用する必要があります。
IOCPは、基本的にWindowsが提供するスレッドセーフなワークキューです。'完了パケット'をIOCPにキューイングすると、別のスレッドがそれをデキューして処理します。
ソケットなど、重複する操作をサポートする多くのタイプのハンドルをIOCPに関連付けることもできます。ハンドルをIOCPに関連付けると、などの重複する操作WSARecv
により、関連付けられたIOCPに完了パケットが自動的に送信されます。
したがって、基本的に、1つのスレッドで1000の接続すべてを処理することができます。各ソケットはオーバーラップしたソケットとして作成され、IOCPに関連付けられます。次に、1000個のソケットすべてを呼び出しWSARecv
て、完了パケットが使用可能になるのを待つことができます。データを受信すると、オペレーティングシステムは関連するIOCPに完了パケットを送信します。これには、読み取られたデータの量やデータを含むバッファーなどの関連情報が含まれます。
1000 個のハンドルをループすることは、1000 個のパケットを送信するよりもはるかに高速であるため、ここではパフォーマンスについて心配する必要はありません。select()
はまだ道のりです。