1

1 つのプロセスで数千のクライアント接続を開始する必要があります。回避する必要がある主な制限は、ドライバーが ConnectEx をサポートしていないため、純粋な IOCP ソリューションを使用できないことです。

私が最初に考えたのは、接続を処理するためのスレッド プールです。各ハンドルは、単純な接続/選択セマンティクスを使用して最大 64 の接続を処理でき、接続されると IOCP を続行します。しかし、これは機能しません。select が実行されると、別のソケットを FD_SET に追加することはできません。したがって、ソケットをノンブロッキングに設定し、代わりにポーリングする必要があります。
最善の解決策は、最も単純なものかもしれません。スレッドごとに1 つの接続クライアント。接続レートを適切に維持できると仮定すると、プール内のスレッドの数は少なくなる可能性があります。

これは奇妙な状況です。ドライバーが ConnectEx をサポートするのが理想的ですが、(今のところ) サポートしていないため、可能な限り最善の方法で回避する必要があります。

別の方法はありますか?

4

1 に答える 1

3

まず、selectダミーのソケット (たとえば、それ自体に接続された UDP ソケット) を使用して中断することは可能ですが、それはあなたのケースではコストがかかるかもしれません。

メッセージを処理できるウィンドウがある場合は、 を使用WSAAsyncSelectして の非同期通知を取得できますconnect。(これにより、自動的にソケットがノンブロッキングになることに注意してください。これには、 への別の呼び出しと無効化への呼び出しが必要WSAAsyncSelectですioctlsocket)。

それがなければ、 を使用できWSAEventSelectますが、これにより、待機ごとに 64 ソケットに制限されることがわかります (これが の上限であるためWaitForMultipleObjects)。これにより、ソケットがブロックされなくなりWSAAsyncSelectます。

(完全な補足として、を含める前にselect定義することで、処理されるソケットの数を増やすことができます)FD_SETSIZEwinsock2.h

于 2011-10-23T14:59:09.430 に答える