2

同じポートで送受信する必要のあるアプリがあります。これは、次の2つの場合に発生する可能性があります。

  • PCがリモートハードウェアと通信している場所。「送信者に返信」するため、データグラムは送信ポートを介してPCに返されます。

  • PCがテストとデモのために自身と通信している場合(ループバックモード)(テストアプリは、UDPを介して偽のデータをメインアプリにフィードします)。

これは、ループバックを達成しようとしたときにのみ失敗するようです。私がそれを機能させる唯一の方法は、レシーバーが最初にセットアップされていることを確認することです-私は保証できません。

上記の状況を確実に処理するためにUdpClientを実装する「正しい」方法を提案することで、誰かが私の検索を絞り込むのを手伝ってもらえますか?

(リモートハードウェアで確実に機能することがわかった唯一の解決策は、単一のUdpClientを双方向で使用することですが、その結果に影響を与える可能性のあるレガシーコードを使用しています。2つのUdpClientを使用してみました。ただし、お互いに足を踏み入れる-場合によっては、一方のクライアントが起動すると、もう一方のクライアントが接続できなくなります。ポート共有を許可するようにExclusiveAddressUse / ReuseAddressを設定すると、レシーバーが最初に開始)

編集

詳細に:

UDPを介して外部ハードウェアと通信します。私たちから通信を受信すると、送信元アドレスに応答するため、同じポートでメッセージを受信します。この部分は正常に機能しています。

ただし、ループバックを使用して外部ハードウェアをエミュレートしようとすると(つまり、「自分自身に」同じポートを介して送受信する場合)、送信を開始する前に受信を開始した場合にのみデータグラムを受信できます。THatは正常に機能しますが、送信してから受信しようとすると、データを受信できません。この場合、私が実際に送信しようとしているものは関係ありません。

だから私は2つの問題があります:

1)確実に機能するループバックを管理する方法。

2)現在正常に動作している外部通信を壊さずに(1)を行う方法!

1つまたは2つのUdpClientのあらゆる種類の組み合わせと、さまざまな設定を試したので(役に立たなかった)、UPDループバックをうまく機能させることができたのではないかと思っていました。私がすべての場合に働くことができる解決策。

これについて考える時間を取ってくれてありがとう...

4

3 に答える 3

5

これは仕様によるものです。

UDP通信は、接続を必要とするTCPと比較してコネクションレスです。

UDPからデータを送信すると、データがブロードキャストされます。つまり、放送時に生きている受信機だけが利用できるということです。

例 :

TCPは電話のようなものです。発信者は受信者に電話をかけます。受信者は呼び出しを受け入れ、通信が行われます。受信者が利用できない場合、発信者はエラーを受け取ります(発信者はクライアントであり、受信者はポートでリッスンしているサーバーです)

UDPはFMラジオ放送のようなものです。誰かが相手を聞いているかどうかに関係なく、曲はラジオで放送されます。受信者がラジオセットを装着している場合は、曲を受信します。曲が10:30に送信され、ラジオが10:30にオンになっている場合、曲を聞くことができます。しかし、10:35にライドセットを装着すると、それを見逃してしまい、二度と聞くことができなくなることを意味します。

アップデート

私が見ることができるように、本当の問題は、アプリケーションXを介してポート1111で送信し、同じマシンのアプリケーションYを介してポート1111で受信することです。

同じように、私は2つの回避策を提案することができます(良くはありませんが実行可能です)。

  1. あなたが言ったように、あなたが受信機を始めた後に送信機を始めるならば、すべては大丈夫です。したがって、送信機を定期的に再起動するロジックを試してみてください。

  2. 毎回2つのポートで送受信します。例えば。1111および2222。リモートハードウェアは1111の最初のセットを使用し、デモアプリケーションは2222を使用します。

于 2010-05-24T11:17:05.520 に答える
3

だから私はあなたの問題を理解していると思います。

あなたが持っている

1-たとえばポート1234で受信しているハードウェアデバイスにUDPデータを送信するクライアントアプリケーション。同時に、このアプリケーションはポート1234でも応答を受信して​​います。

2-ポート1234でUDPデータを受信し、ポート1234で送信者に応答するハードウェアデバイス。

したがって、同じマシンでハードウェアデバイスをエミュレートすると、クライアントアプリケーションとハードウェアエミュレーターの両方が同じIPアドレス127.0.0.1とポート1234でUDPパケットをリッスンすることになりますか?

私はあなたが持っているものの本質を捉えましたか?

その場合、マシンに2番目のIPアドレスを追加することを検討しましたか。これは、2枚のネットワークカードが必要であることを意味するものではありませ。1枚のネットワークカードに複数のIPアドレスを設定できます。そうすれば、2つの「デバイス」を別々のインターフェースに配置して、両方を同じインターフェースに配置する競合を克服することができます。

たとえば、2つのIPアドレス192.168.0.5192.168.0.6

クライアントアプリケーションは 、ハードウェアエミュレータがで受信して応答している間に、に送信192.168.0.6および受信することができます。192.168.0.5192.168.0.6192.168.0.5

IPアドレスを追加する方法を説明するリンクは次のとおりです。
http://www.itsyourip.com/networking/how-to-add-multiple-ip-address-in-windows-2000xp2003/

これは2000/XP / 2003の場合ですが、プロセスはVistaとWindows7の場合と同様です。

于 2010-05-24T16:40:55.820 に答える
0

このコードから長い間離れた後、私はそれをもう一度見る機会を得て、この問題に対する恥ずかしいほど些細な解決策を考え出しました。

私のUDPクラスを呼び出すクライアントコードは、送信と受信の両方に設定していたことがわかりました。したがって、書き込みアクセスを備えた送信機と読み取りアクセスを備えた受信機を使用する代わりに、実際には読み取り/書き込み機能を備えた送信機と読み取り/書き込み機能を備えた受信機を使用しました。

これは、送信機が最初に初期化された場合、そのポートでも受信を試みるため、送信されたすべてのデータグラムを取得することを意味しました。受信機が接続されたとき、送信機によって消費されていたという理由だけでデータを受信することはありませんでした。

于 2011-02-05T12:07:55.213 に答える