2017-11-07 8 views
0

ソケット通信に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アドレスとポート番号を持つ場合にのみ、この結果を生成します。これは期待された動作ですか(うまくいけば)?もしそうなら、これを達成する別の方法がありますか?

+0

コードが正しいと思われるかもしれません。しかし、あなたはまだ投稿する必要があります。接続前のバインドは無意味です。 – EJP

+0

右私は朝に投稿します。私はちょうど2つの重複したリモートアドレス対2つの一意のリモートアドレスを使用すると、異なる動作のために正しいと思う。 ConnectEx()を使用している場合は、バインドが必要です。私はバインドせずに接続しようとしていない。 – Ken

+3

"*いずれかのリモートから応答が返ってくると、両方の未処理のオーバーラップ操作の完了イベントがトリガされます*" - 読み込みごとに 'OVERLAPPED'インスタンスを正しく区切った場合は不可能です。あなたは明らかにIOCPコードにバグがあります。 2つのソケットに同じリモートIP /ポートを使用することは、この問題とは関係ありません。ソケット接続は、プロトコルとローカルIP /ポートとリモートIP /ポートによって一意に識別されます。同じマシン上の複数のクライアントは、異なるローカルIP /ポートにバインドされている限り、同じリモートIP /ポートに安全に接続できます。 –

答えて

0

実際に問題が発生した理由を説明していますが、回答を投稿しています。

私のテストには、データを提供するリモートデバイスに接続して通信することが含まれていました。それはdigiターミナルサーバーの反対側にあることが判明しました。したがって、接続パスは:

私のテストコンピュータ(TCP経由) - > Digiターミナルサーバー(シリアル経由) - >リモートデバイスです。

digiターミナルサーバーは、基本的にTCP/IPをシリアル通信に変換して戻します。シリアル側には「接続性」の概念がないため、digiはTCP/IP要求に応答してシリアルデータを受信するTCP/IP接続を認識しないため、シリアルデータをTCP/IP側。それは私の保留中の重複した操作の両方でIOCPトリガーを生成していたものです。要求がdigiに送信されるたびに、要求がシリアルポートから送信されました。エンドデバイスが応答すると、その数字はそれぞれのTCP/IP接続に応答データを転送しました。

私の質問にコメントした皆様に感謝しますが、お時間を頂戴して申し訳ありません。

関連する問題