問題タブ [hole-punching]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1426 参照

c++ - boost::asio による穴あけ

穴あけプロトコルでサーバークライアントを作ってみました。したがって、サーバーにクライアントIPとクライアントポートを送信し、2番目のユーザーが接続されると、サーバーは他のクライアントのIPとポートの両方をクライアントに送信します。だから私はこれを持っているとき、両方のクライアント間の接続を確立しようとしましたが、boost::asio でエラーが発生しました

what(): サービスが見つかりません 中止されました

ここに私のコードがあります

0 投票する
1 に答える
1297 参照

c++ - Windows 7 で libjingle をコンパイル中にエラーが発生しました

libjingle のダウンロードに含まれている README に従いました。すべてのサードパーティ パッケージをインストールし、次のコマンドを実行しました。

hammer.bat --jobs=6 --verbose --mode=all all_programs

次のエラーが表示されます。

環境の詳細:

ウィンドウズ7

パイソン2.7.3

scons 2.1.0

Visual C++ 2010 Express

0 投票する
1 に答える
2071 参照

java - シンプルな PHP NAT パンチスルー サーバー スクリプト

「マスターサーバー」として機能し、2 つの Java ゲームクライアント間の P2P 接続を容易にする PHP スクリプトを作成しようとしています。マスター サーバーのポート アクセスを許可する共有 Web ホストを使用しています。

手始めに、マスター サーバーと Java クライアント間の UDP ソケット接続をテストしたいと思いました。「masterServer.php」という名前の PHP スクリプトを次に示します。

masterServer.php にアクセスしてスクリプトを実行すると、数秒以内に UDP パケットをマスター サーバーに送信する単純な Java アプリケーションを起動します。Java アプリケーションのコードは次のとおりです。

私の理解によると、PHP サーバーは UDP パケットを受信して​​いません。スクリプトは、ブロックしている socket_recvfrom() メソッドを通過せず、UDP パケットの内容を出力テキスト ファイルに書き込みません。誰でも私を助けることができますか?

0 投票する
1 に答える
1886 参照

networking - UDP ホール パンチング: 1 つの対称 NAT と別の非対称 NAT

ホールパンチングで P2P を実装しようとしています。フローは次のとおりです。

  1. 両方のピア (P1、P2) がサーバー (S) に 1 つのパケットを送信します。
  2. サーバー (S) は両方に返信し、他の IP:PORT を伝えます。
  3. P1 と P2 は、他の外部/パブリック IP:ポートを認識して、この UDP パケットを受信します。
  4. P1、P2 は、他のピアのパブリック IP:PORT にパケットの送信を開始します。
  5. ピアが他のピアのパケットを受信したら、穴が開いていると想定し、このソケットをアプリケーションに渡します。

これをさまざまなルーターでテストしました。結果は次のとおりです。

  • P1 と P2 の両方が非対称 NAT (フル/制限付きコーン) にある場合、問題は発生しません。
  • P1=非対称、P2=対称の場合:
  • -----router-1 (対称 NAT) + router-2 (非対称) = 成功
  • ----ルーター 3 (対称 NAT) + ルーター 2 (非対称) = *失敗*

4段目までは大丈夫。しかし、5 番目のステップでは、他のピアのパケットを受信するピアはありません。少なくとも* 「非対称 NAT の背後にあるピア」が他のパケットを受信することを期待していました。*

誰が何が起こっているのか知っていますか?

0 投票する
1 に答える
1167 参照

qt - QtでUDPホールパンチングを行う方法は?

データグラムを送受信できるインターネット上のサーバーがあります。

サーバーからデータグラムを受信できるように穴を開けるには、クライアント側で何をすべきですか?

0 投票する
2 に答える
6328 参照

networking - さまざまな NAT の動作をシミュレートする方法

UDP と UDT を使用してホールパンチングに取り組んでいます。最終テストでは、さまざまな NAT タイプ (対称、フル コーン、制限付きコーン、ポート制限付き NAT) でアプリケーションをテストする必要があります。

これらをシミュレートできる方法はありますか?ここで期待しているのは、ある種の仮想ボックスのセットアップです。必要に応じて構成できるように、PC をルーターとして使用できますか?

一般に、さまざまなネットワーク条件でアプリケーションをテストするにはどうすればよいでしょうか?

0 投票する
4 に答える
12045 参照

c# - UDPホールパンチ。サーバーにクライアントと通信させる

UDPホールパンチングの実装方法についてよく読んでいますが、何らかの理由で機能させることができません。

udp ホール パンチングが何であるかをよく知らない人のために、私自身の定義を以下に示します。

目標は、サーバーの助けを借りて 2 つのクライアント (クライアント A とクライアント B) 間でデータを転送できるようにすることです。したがって、クライアント A はサーバーに接続し、その情報を送信します。クライアント B も同じことを行います。サーバーには、クライアント A がクライアント B にデータを送信したり、クライアント A からクライアント B にデータを送信したりできるように、必要な情報があります。したがって、サーバーはその情報を両方のクライアントに提供します。両方のクライアントが互いに関する情報を取得すると、サーバーの助けを借りずにそれらのクライアント間でデータの送受信を開始できます。

私の目標は、今説明したこと (udp ホール パンチング) を実行できるようにすることです。その前に、サーバーからクライアントに接続できると便利だと思います。そのために、クライアントに関する情報をサーバーに送信する予定です。サーバーがその情報を受信したら、最初からクライアントに接続しようとします。それを実行できるようになったら、実際の udp ホール パンチングの実装を開始するために必要なものがすべて揃っているはずです。

設定方法は次のとおりです。

ここに画像の説明を入力

上のルーターにはサーバーがあり、下のルーターは LAN ポートに接続されています。下のルーター (NAT) は、WAN ポートを介して上のルーターに接続されています。クライアント コンピュータは、下のルーターの LAN ポートの 1 つに接続されています。

したがって、その接続では、クライアントはサーバーを見ることができますが、サーバーはクライアントを見ることができません。

したがって、擬似コードで行ったアルゴリズムは次のとおりです。

  • クライアントがサーバーに接続します。
  • クライアントは、NAT でいくつかのポートを開くためにいくつかの UDP パッケージをサーバーに送信します
  • クライアントがリッスンしているポートでサーバーに情報を送信します。
  • サーバーがその情報を受信したら、最初からクライアントに接続しようとします。

コードでの実装は次のとおりです。

サーバ:

クライアント:

何らかの理由で数回機能しました!クライアントが回線でデータを正常に受信すると機能します。sending_socket.Receive(buffer);

注意事項:listner 2 番目の部分のサーバーで、新しい変数を作成する代わりに インスタンス変数を使用し、sendSocketその変数を介してバイトを送信した場合、クライアントは送信されるデータを受信できます。サーバーの 2 番目の部分は 2 番目のクライアント B によって実装されることを思い出してください。そのため、変数を最初から再度初期化しています...


編集:

ここでは、同じ問題を別の方法で見ることができます。同じオブジェクトを使用する代わりに新しいオブジェクトを初期化すると、クライアントは応答を受け取りません。

タイプ UdpClient のオブジェクトがあります。そのオブジェクトでデータを他のピアに送信できます。同じプロパティを持つ同じタイプの別のオブジェクトを作成してデータを送信しようとすると、機能しません! いくつかの変数を初期化するのに欠けている可能性があります。リフレクションでプライベート変数を設定できるので、問題はありません。とにかくここにサーバーコードがあります:

クライアント コードは基本的にサーバーにデータを送信し、応答を待ちます。

クライアントはルーター (NAT) の背後にあることに注意してください。それ以外の場合、この問題は発生しません。udpClient をコピーする理由は、その変数を別のコンピューターに送信して、他のコンピューターがクライアントにデータを送信できるようにするためです。

だから私の質問は 、元のオブジェクトlistenerがデータを送信できるのにできnewClientないのはなぜですか? sending_socket.Receive(buffer);サーバーが行を実行した後でも、クライアントは行で待機し続けます: newClient.Send(dataToSend, dataToSend.Length);。リスナーがデータを送信しても newClient を送信しない場合、クライアントはデータを正常に受信します。両方の変数の宛先 IP とポートが同じ場合、これはなぜですか? 変数はどのように異なりますか?

注: サーバーとクライアントが同じネットワーク上にある場合、コピーは機能し、変数newClientはクライアントにデータを送信できます。この問題をシミュレートするには、クライアントが NAT (ルーター) の背後にある必要があります。このようなネットワークの例は、2 つのルーターで構成されている場合があります。それらをルーター X とルーター Y と呼びましょう。S とクライアント C のサーバー呼び出しも必要です。これにより、S は X の LAN ポートの 1 つに接続できます。C は Y の LAN ポートの 1 つに接続できます。最後に、Y の WAN ポートを X の LAN ポートの 1 つに接続します。

0 投票する
2 に答える
14715 参照

udp - 3GでUDPホールパンチングが実行されない

ソフトウェアに穴あけ機能を実装しようとしています。重要なのは、ユーザーと通信するために、すでに作成されたTCPサーバーを使用してこれを実装しているということです。

これが私がこれまでに持っているものです:

  • 「A」はUDPサーバー「US」(ポート9333)にメッセージを送信します
  • 「US」は、接続したポートを「A」に送り返します(ポート31000-ローカルポート31005)
  • 「A」はTCPサーバー「TS」にメッセージを送信し、Bに接続したい(そしてポート31000を指定したい)ことを伝えます。
  • 「TS」は「B」にメッセージを送信し、「A」のポート(31000)とIPを通知します。
  • 「B」は「US」にメッセージを送信します(ポート9333)
  • 「US」は「B」にメッセージを送信して、ポート45000(ローカルポート45005)を通知します。
  • 「B」は「TS」にメッセージを送信し、udpポート(45000)を提供します。
  • 「TS」は「A」にメッセージを送信し、Bのudpポート(45000)とIPを通知します
  • 「A」は、ポート45000でBのIPにudpメッセージの送信を開始し、ローカルポート31005でリッスンします。
  • 「B」は、ポート31000でAのIPにudpメッセージの送信を開始し、ローカルポート45005でリッスンします。

もちろん、ポート31000、31005、45000、45005はここにあります。たとえば、新しい接続ごとにポートが変更され、9333のみが静的になります。

本来あるべき以上に、何度も行き来していることを私は知っています。事実、私はTCPサーバーを使用して両方のユーザーと通信する必要があります。udpサーバーは、ユーザーのポートを自分自身に返し、TCPサーバーに送り返すことができるようにするためにここにあります。

ただし、ユーザー間のメッセージは誰にも受信されません...誰もが理由を知っているでしょうか?


編集 :

http://nattest.net.in.tum.de/test.phpを使用してルーターをテストしましたが、UDPホールパンチングは正常に機能するため、問題はルーターからではなく、プロトコルから発生しています...

ユーザーが同じNATの背後にいる場合、すべてが正常に機能します。もちろん、privates ipを使用しますが、コードも機能していることを意味するため、プロトコルの問題が発生します...


編集2:

実際、私はそれを半分機能させました(そして、問題はプロトコルではなく、実際に私のコードから来ていました...私は2人のユーザーを接続しました。

面白いことに(それほど多くはありませんが)、両方のユーザー間でデータを送受信できたのは1つのソケットだけでした。(iphoneによって開始されたソケット)プロトコルによれば、2つの適切に接続されたソケットが必要ですが、間違っていますか?

そのため、NATに穴を開けることができましたが、実際にはセルラーNATには穴を開けませんでした。

もちろん、私は3Gで接続された2台のiPhoneをすぐにテストしました。そして、誰も他からのメッセージを受け取りません。

セルラーNATについて何か見逃しましたか?

PS:質問を更新して申し訳ありませんが、答えが得られないので、自分で見つけようとしています...

PS 2:NATに穴を開けることができたので、「on3G」を追加してタイトルを変更しました


編集3:iphoneの3G接続を介してインターネットに接続されたコンピューターでhttp://nattest.net.in.tum.de/test.phpテストを再度実行しました。

結果は次のとおりです。 UDPホールパンチングの結果

どうやらすべてのUDPホールパンチングテストは9番目のテストで成功しました。

さらにそれはそうです:

UDPバインディングテスト(?):エンドポイントに依存しないバインディング、ポート予測は簡単

したがって、3G接続を介して2つのピアを接続するのに問題はないはずです(「ホーム」NATの背後にあるほどではありません)...私は正しいですか?


編集4:

念のため、2つの異なるUDPサーバーにメッセージを送信して、ポートとローカルポートが3Gで同じかどうかを確認します。

簡単に言うと、両方のサーバーで接続する場合、ポート(ローカルとパブリック)は同じです。したがって、EDIT 2で行われたテストは正しく、udpはエンドポイントに依存しないため、ホールパンチングを実行しても問題はないはずです...(少なくとも私のISPでは)

0 投票する
1 に答える
165 参照

udp - 1ポートでUDPホールパンチ?

UDP を使用してシステムのユーザーに PUSH 通知を送信したいのですが、うまくいくでしょうか?

ポートを持つサーバーが 1 つあると仮定すると、UDP:8888 を開いて接続を待機しているとします。私の質問は次のとおりです。

  • 多くのユーザーが接続できますか? (HTTP 90 サービスのように?)

  • はいの場合、クライアントの接続後、彼の UDP ポート番号と IP アドレスを取得します > サーバーからクライアントの UDP ポートへの新しい接続を確立し、データを送信できますか?

ありがとう :)

0 投票する
1 に答える
1984 参照

udp - IDLE UDP ポートを開いたままにするようにルーターを強制する

クライアントがサーバーへの UDP 接続を開き、しばらく (10 分~24 時間) 後、サーバーはクライアントにデータを送り返す必要がありますが、クライアントの UDP ポートが閉じられていることがわかります。

テストの後、クライアントはまだ UDP ポートを開いていることがわかりましたが、ルーター (nat) はおそらく非アクティブのためにポートを閉じました!

キープアライブ パケットを送信せずにルーターに UDP ポートを開いたままにする方法はありますか? (サーバーまたはクライアント側) .

ICMPにそのようなものはありますか?

ありがとうございました 。