ソケット通信にIOCPを使用するクライアントアプリケーションがあります。私はConnectExを使用して、リモートエンドポイングへのTCP接続を行います(ConnectExを呼び出す前に、ソケットをADDR_ANYとポート0にバインドします)。ConnectExが同じIPアドレスとポートに接続する2つのソケットは、重複したIOCPイベントを生成します。
同じリモートエンドポイント(同じIPアドレスとポート番号)に2つの接続を持つことは有効です。現在のコードでその状態をテストすると、WSARecv()への呼び出しから2つの重複したIO読み取り操作が未処理(接続されたソケットごとに1つ)になります。各WSARecv()は正しいソケットとオーバーラップ構造で呼び出されます。例:WSARecv(socket1、... overlapped1)およびWSARecv(socket2、... overlapped2)。私が遭遇した問題は、いずれかのリモートから応答が返ってくると、両方の未処理のオーバーラップ操作の完了イベントがトリガーされるということです。私のコードは、2つのリモートアドレスが同じIPアドレスとポート番号を持つ場合にのみ、この結果を生成します。これは期待された動作ですか(うまくいけば)?もしそうなら、これを達成する別の方法がありますか?
コードが正しいと思われるかもしれません。しかし、あなたはまだ投稿する必要があります。接続前のバインドは無意味です。 – EJP
右私は朝に投稿します。私はちょうど2つの重複したリモートアドレス対2つの一意のリモートアドレスを使用すると、異なる動作のために正しいと思う。 ConnectEx()を使用している場合は、バインドが必要です。私はバインドせずに接続しようとしていない。 – Ken
"*いずれかのリモートから応答が返ってくると、両方の未処理のオーバーラップ操作の完了イベントがトリガされます*" - 読み込みごとに 'OVERLAPPED'インスタンスを正しく区切った場合は不可能です。あなたは明らかにIOCPコードにバグがあります。 2つのソケットに同じリモートIP /ポートを使用することは、この問題とは関係ありません。ソケット接続は、プロトコルとローカルIP /ポートとリモートIP /ポートによって一意に識別されます。同じマシン上の複数のクライアントは、異なるローカルIP /ポートにバインドされている限り、同じリモートIP /ポートに安全に接続できます。 –