問題タブ [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 に答える
69 参照

udp - 既存のアプリケーションの UDP ホール パンチング

大学のネットワークで YAWCam を使用しようとしています。別のネットワークの背後にある別のアプリケーションがアクセスする必要がある mjpg ストリーマーとして使用しています。残念ながら、大学のネットワークにポート転送する方法はありません。udp-hole Punching に入ります。これを知ったときは素晴らしいと思いましたが、このプログラム (オープンソースではない) を実際に変更する方法を理解できない限り、UDP ホール パンチングを従来の方法で機能させることはできないことにすぐに気付きました。

私の質問は、元のプログラムを変更せずに穴を開ける方法はありますか? おそらく、yawcam が穴を開けるのに使用する同じポートからパケットを送信し、通常のリクエストでそれを更新させることでしょうか? 私はネットコードに少し慣れていないので、これに対する「正しい」方法が何であるか完全にはわかりません。

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

java - udp ホール パンチ 間違ったポート?

質問: ポートが間違っていますか (UDP パンチを作成するため)?

クライアントとサーバーの接続からIPとポートを保存するJavaサーバーを入手しました。IP とポートがクライアントとサーバーに送信されるため、クライアントとサーバーは UDP ホール パンチを開始できます。同じNATに接続された2台のコンピューターを使用しています。しかし、それは働くことを拒否します。

Javaサーバーのログには次のように書かれています:

サーバーとクライアントは udp パケットの送信を開始しますが、しばらくするとタイムアウトします。Wireshark を使用してホール パンチを確認したところ、クライアント ログは次のようになりました。

サーバーログ:

クライアントからのパケットがサーバー ログに見つかりません。また、クライアント ログにサーバー パケットが見つかりません。

これは Java サーバー コードです。

完全なコードはhttps://github.com/Parakoopa/GMnet-GATE-PUNCH/tree/master/src/main/java/org/parakoopa/gmnetgate/punchにあります。

サーバー.java

TCPConnection.java:

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

p2p - P2P アプリケーション、ホール パンチングがエンドポイントに依存しないマッピング NAT で機能しない

私は現在、「ホールパンチング」メソッドを使用して、C で (UDP) p2p アプリケーションを実装しています。J. Selbie による以前の投稿を実際に説明しているのを見つけました。彼は基本を説明し、それに応じて進めました ( post1post2 )。

ここに私が取っているステップがあります:

  • セットアップ: ピアの 1 つは 4G セルラー ドングル (NAT A) に接続され、もう 1 つは ISP プロバイダー (NAT B) に接続するルーターに接続されます。これらは、両方の NAT の stunclient (stuntman クライアント) について報告された結果です。

    /li>

さて、これらの結果によると、両方の NAT が適切な動作をしており、ホール パンチングが成功する可能性があることを理解しています (NAT A はポートの保存を行わないことに注意してください)。

  • ホール パンチングの試行: 両方のクライアントが、UDP を使用して公開サーバー (STUN/ランデブー) に接続し、ip:port ペアを検出/交換します。各クライアントは、サーバーからの応答を受信すると、UDP データグラムを他のピア (接続されたパブリック サーバーから見た ip:port) に送信し、さらに送信して受信し、アドレスにメッセージを返信します。それはどこから来たのか。公開サーバーに接続したのと同じソケットを使用してデータグラムを送信していますが、sendto 関数の宛先 ip:port のみを変更しています。

問題は、NAT A の背後にあるホスト (4G ドングルに接続されている) が常にメッセージを受信し、宛先の正しい IP とポートに応答するにもかかわらず、背後にある別のホスト (NAT B) がメッセージを受信しないことです。私がここで見逃しているアイデアはありますか? または問題を診断する方法??

前もって感謝します。

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

android - Android 中央に円形の穴をあける切り抜き画像

私はアンドロイド脳のアイデアのために再び来ます!

ビットマップがcenterCropとしてスケーリングされているimageViewに円の穴を入れたいと思います。円の穴 (左と下からの dp) と穴の半径を配置する必要がある場所を知っています。でも作り方がわからない!

Porterduff を使用して穴を開けられることはわかっていますが、何をすればよいでしょうか?

  • カスタム ビットマップ
  • カスタム ドローアブル/ビュー
  • カスタムコード

ありがとう

回答に続いて、穴のある私の CustomImage があります:

これらの行を使用してプログラムで呼び出しました:

しかし、onDraw()メソッドは2回呼び出されます(おそらく必要です)が、これにより2つの穴ができます。1つはパラメーターを変更できますが、もう1つは同じ場所にあります。のコンテナMyImageViewRelativeLayout.

誰かがアイデアを持っている場合は?@tiny-sunlight ?

0 投票する
0 に答える
118 参照

java - 穴あけ・・・要経験者

大量のコーディングを行う前に、これが正しいかどうか、および 3G で動作するかどうかを確認したいと思います。穴あけ機能を実際にやってみた方からのご意見大歓迎です。

A -> S (TCP): A's socket info

B -> S (TCP): B's socket info

A -> S (TCP): A request for B's socket info

S -> A (TCP): B's socket info

A => B: keeps shooting B's socket info with UDP packets

S -> B (TCP) A's socket info + connect

B => A: keeps shooting A's socket info with UDP packets

A <-> B (TCP): data

私は本当にTCPを好みます。これが機能しない場合、何が問題で、機能させるにはどうすればよいですか?

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

java - libGDX クライアント (サーバー) クライアント接続

マルチプレイヤーゲームを作成しようとしています。これを行うには、次の 3 つの方法があると思います。

ルーターのポートを開く人はごくわずかです。

これは非常に複雑で、すべてのルーター/NAT で機能するとは限りません。

これがマルチプレイヤーを実現する最も簡単な方法だと思います。だから私の計画は、他のプレーヤーとのソケット接続も持ち、データを渡す PHP サーバーへのソケット接続を確立することです。

現時点では、クライアント部分とテスト サーバー部分を Java で作成しています。

クライアントからのソケット接続からデータを受信するにはどうすればよいですか?

そして、これを行うためのより良い方法はありますか?

0 投票する
0 に答える
227 参照

c# - TCP ホール パンチングが機能しない

ピア 2 ピア アプリケーションを作成します。プログラミングの初心者です。ホール パンチングに関する記事をいくつか読みました。今では、NAT とホール パンチング テクニックの基本概念を理解しています。しかし実際には、私はそれを成功させることができませんでした。ホール パンチング テクニックを利用するつもりです。この単純なテスト アプリケーションを C# で作成しました。これは、IP とポートを取得した後、パブリック IP とポートを見つけるために PHP サーバーに要求を送信します。この取得した IP に要求を送信します(ループバック)、しかしそれは機能しません。なぜうまくいかないのかわからない、どこが間違っているのですか?これが私のコードです。

これが私のPHPファイルです。

アプリケーションを実行すると、出力は次のようになります

アプリケーション出力のスクリーンショット

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

android - NAT の背後での作業 - デバイス通信のスキーム

組み込みデバイス (xMega128(C) ベース) と Android アプリ間のデータ交換を可能にするソリューションを考え出そうとしています。問題は、データ交換をインターネット経由で行う必要があり、組み込みデバイスとアプリを実行するモバイル デバイスの両方が異なる NAT の背後にあり、異なる ISP、3G、LTE などを使用して接続できることです。

UDP ホール パンチングを試しましたが、対称 NAT では機能しません。予測付きの多穴パンチングも、100% の信頼性を保証するものではありません。ICE の使用も検討しましたが、ICE C ライブラリ (pjnath、libnice) は選択したハードウェアと互換性がありません (ライブラリには os が必要です)。現在、トラフィックリレーサーバーの実装または使用 (存在する場合) を検討していますが、それは私にはハックのように思えます。

私が考慮していなかった他のオプションはありますか?どんな助けでも大歓迎です。

理想的には、通信スキームは次のようになります。

  • 100%信頼できる

  • 比較的低遅延 (絶対最大 3 秒)

  • スケーラブル (将来的には最大 50 万デバイス)

  • アプリとデバイスの両方で初期化可能

  • マルチユーザー – 1 つのデバイスが多数の Android アプリに接続します

また、これが役立つ場合、デバイスとアプリの間のデータ交換はそれほど激しくありません。1 時間あたり約 1 セッション、1 セッションあたり最大 50 件のメッセージが 10 ~ 20 秒間隔で送信され、各メッセージの重量は約 100 バイトです。

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

c# - ランデヴァスサーバーなしのC#UDPパンチスルー

私は、2 つのクライアント (ピアツーピア) がサーバーをまったく使用せずに相互に接続する必要があるプログラムを作成しています。両方のクライアントは、互いのパブリック IP とプライベート IP を既に知っています。1 つまたは両方のクライアントが NAT の背後にある可能性があります。IPv6 に頼ることはできません。

私が直面している問題は、1 つのクライアント (A と呼びましょう) が、A の NAT に穴を開け、既に穴が開いている B の NAT を通過するパケットを別の (B) に送信する必要があることです。ただし、NAT の背後にある B のローカル ポートは使用できないため、B がパンチスルーした B の NAT 上の外部ポートを A が認識している必要があります。さらに、B は、NAT の背後からこのポートを識別することができません。 問題の視覚的表現 このポートを識別する方法はありますか、または単に B に使用するポートを NAT に通知させる方法はありますか?

前もって感謝します。

PS Unity が使用する .NET のバージョン、約 2.0 を使用しています。

PPS TCP で動作するソリューションがある場合は、それも使用します。

PPPS または Http 以外のほぼすべてのプロトコル!

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

nat - ICMP ホールパンチングの欠陥?

問題の NAT デバイスがアウトバウンド ICMP パケットを書き換える場合、ICMP NAT トラバーサルはどのように機能するはずですか?

ダイアグラム

力学

で説明されている ICMP ホールパンチングの概要pwnat:

SERVERは、ICMP エコー要求パケット (ping) を他のホスト (例: 3.3.3.3) に送信して、 に穴を開けNAT-Sます。接続しようとするCLIENTと、ICMP Time Exceeded パケットを に送信します。NAT-Sこれは、 にルーティングされるはずSERVERです。上記のルーティングを機能させるために、最初に送信すると予想されるCLIENT同じパケット ( への ICMP エコー ) をその中に埋め込むことによって、ICMP Time Exceeded パケットを構築します。3.3.3.3SERVER

問題

ICMP Time Exceeded 応答にCLIENT残されたのと同じ (ICMP エコー要求) パケットを埋め込む必要がある場合は、パケットのクエリ ID を知っている必要があります。しかし、このクエリ ID をどのように知るのでしょうか?NAT-S

RFC 3022 セクション 2.2によると、 は発信 ICMP エコー要求にNAT-S遭遇すると、パケットのクエリ ID フィールドを一意の外部クエリ ID に書き換えて、同じクエリ ID を持つ今後の ICMP エコー応答を にルーティングできるようにしますSERVER

上記の問題を考えると、pwnatICMP ホールパンチングの背後にある前提は無効であり、決して機能しないと思われます。ここで何か不足していますか?

前もって感謝します :)