2011-10-23 7 views
1

クライアントの接続を1つのプロセスで開始する必要があります。回避する必要のある重要な制限はConnectExをサポートしていないため、純粋なIOCP溶液。ConnectexなしのWindowsで非ブロッキングソケット接続

私の最初の考えは、各ハンドルは、プレーン接続を使用して64個の接続を扱うことができる場所/セマンティクスを選択し、接続を処理するスレッドプールで、一度接続がIOCPを続行します。 しかし、これは動作しません。 selectが実行されると、別のソケットをFD_SETに追加できません。だから私は非ブロックにソケットを設定し、それらを代わりにポーリングする必要があります。
最も簡単な解決策は最も簡単な方法です。 1 接続スレッドごとのクライアント。私が接続速度を合理的に保つことができると仮定すると、プール内のスレッドの数は少なくなる可能性があります。

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

別の方法がありますか?それはあなたのケースでコストがかかるかもしれませんが

答えて

3

まず、それは、ダミーソケット(例えば自身に接続されたUDPソケット)を使用してselectを破ることが可能です。

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

この場合、WSAEventSelectを使用することができますが、これにより、待機あたりのソケット数が64ソケットに制限されています(これはWaitForMultipleObjectsの上限です)。これにより、あなたのソケットは非ブロック化され、WSAAsyncSelectの場合と同様に元に戻すことができます。

(完全な注意点として、あなたがwinsock2.h含む前FD_SETSIZEを定義することでselectで扱うソケットの数を増やすことができます)

+0

WSAAsyncSelectとWSAEventSelect両方が便利に聞こえます。私は、接続ごとに1つのスレッドでオフを開始し、その後、これら二つのいずれかを使用して64のグループに接続をプールすると思います。ありがとうございました。 – hplbsh

+0

私はWSAAsyncSelectがWindowsメッセージを使用していることに気付かなかった。厄介ですが、潜在的に非常に有用です。 – hplbsh

関連する問題