5

大規模なプロジェクトでUDPホールパンチングを使用する可能性をテストするための単純なP2Pアプリケーションを作成しています。

昨日自宅でテストアプリを試してみましたが、うまくいきました。

しかし、私は現在仕事をしていて、同じコードはもはや仕事をしていません。送信者はここ​​でルーターの外部IPアドレスの適切なポートに送信していますが、受信者はそれらを取得していません。

を呼び出す前にUdpClient.Receive()、受信側のアプリは、リッスンするIP:ポートにパケットを送信します。繰り返しますが、これは私の家のセットアップでは機能しますが、ここでは機能しません。結果は、Windowsファイアウォールがオンかオフかに関係なく同じであるため、問題ではありません。

ルーターが状況を異なる方法で処理している可能性がありますか?

編集1:両方のアプリが同じマシンで実行されます。

4

1 に答える 1

2

私自身の質問に答えて:

ルーターは実際に異なる動作を示していました。

私のホームルーターは私のラップトップだけに接続されています。これが、ポートnからUDPパケットを送信すると、ルーターもポートnに残される理由だと思います。

ただし、私の仕事用ネットワークは複数のコンピューターで構成されており、ルーターはその端でポートをランダム化します。つまり、ポートyから送信されたパケットは、ルーターをポートxに残します。

次の方法でポート転送を使用せずに、自宅と職場のマシンがNATを介して通信できるようになりました。

H-ポートaからW:bにパケットを送信し、それによって着信接続用にポートaを開きます

W-パケットをH:aに送信し、受信モードに切り替えます。現在もポートが開いています。

H-Wからパケットを受信し、どのポートに応答するかを推測する代わりに、パケットの送信元ポートをチェックして、代わりにそれを使用します。

H-パケットをW:送信元ポートに送信します

W-パケットを受信します。

出来上がり。

実際には、tho、H、およびWはサーバーに接続して接続の詳細を交換します。これにより、サーバーはHとWが送信しているポートを正確に認識しているため、問題が単純化されます。

于 2010-12-21T11:33:04.630 に答える