問題タブ [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.
c# - UdpClient.Send メソッドと UdpClient.Client.Send メソッドの違い
UdpClient.Send(byte array) または UdpClient.Client.Send(stream) メソッドを使用して、udp プロトコル全体でデータを送信できます。どちらの方法も機能します。唯一の違いは、一方のメソッドではバイト配列を渡し、もう一方のメソッドではストリームを渡すことです。
簡単な例:
また、情報を失うことなくデータが目的の場所に到達することを保証する方法はどれですか? udp プロトコルは、すべてのバイトが宛先に到達することを保証しないため、ビデオ、オーディオのストリーミングには適していますが、私が行っているようなファイルの転送には適していないことを読みました。tcp の代わりに udp を使用する理由は、たまたまルーターの背後にいる 2 人のユーザー間で tcp 接続を確立するのが非常に複雑だからです。ユーザーの 1 人が自分のルーターでポート フォワーディングを有効にすれば、それが可能になることはわかっています。udpパンチホールと呼ばれるものを実行して、データを送信することができました。udp パンチ ホールを使用すると、サーバーの助けを借りて、ルーターの背後にいる 2 人のユーザー間の接続を確立できます。ここでそれがどのように機能するかを説明すると長くなりますが、グーグルで検索すると多くの情報を見つけることができます. とにかく、tcp の代わりに udp を使用していた理由をお知らせしたかっただけです。データが失われないことを確認しながら、このプロトコルでファイルを送信できるかどうかはわかりません。おそらく私はアルゴリズムを作成する必要があります。または、UdpClient.Client.Send メソッドはデータが受信されることを保証し、UdpClient.Send メソッドはデータが受信されることを保証しません。
c++ - ポートを開かずに 2 台のコンピュータ間で通信し、3 台目のコンピュータを使用して接続をセットアップする
サーバーがあり、それに 2 つのクライアントが接続されているとします。(TCP経由ですが、問題ありません)
私の目標は、これら 2 つのクライアント間の直接接続を可能にすることです。これは、たとえば、2 人のプレイヤー間での直接の音声通信、またはサーバーとの対話を必要としない他のクライアント プラグイン (2 人の間で何らかのランダムなゲームをプレイするなど) を可能にするためです。サーバーは、接続のセットアップを支援するためにそこにいることができます。
夕暮れの答えから、私はいくつかの手がかりを得ました:
それを行うためのアルゴリズムを説明するhttp://en.wikipedia.org/wiki/STUNと
http://en.wikipedia.org/wiki/UDP_hole_punching
それらから、私はより多くのリードを得ました:
http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html
http://nutss.gforge.cis.cornell.edu/stunt.php -- TCP を使用した可能な STUN 実装
時間が経てば、自分のプログラムのために何かを解決できるはずです。今のところ、私は C++ と TCP (Qt ソケットまたは Boost ソケット) を使用していますが、必要に応じて、C で UDP を実行してラップしてもかまいません。
この報奨金は、C および C++ の使用経験があるすべてのプログラマーに用意されており、サンプル プログラム、更新されたライブラリー、またはその他の有用な情報にリンクすることで、これを簡単にするためのヒントを提供してくれる可能性があります。文書化され、柔軟で機能する C++ TCP 実装が最善ですが、私が得たものを採用します!
http - http での穴あけ
Godaddy にサーバーがあるように、http で穴をあけるにはどうすればよいですか tcp リスナーのポート アクセスが閉じられているため、要求から aspx ページへのクライアントのポート番号を取得できますか?
java - UDP NATホールパンチ用のPHPとJava ...?
Java アプリケーションの 1 つで NAT ホール パンチングを使用したいのですが、どこから始めればよいかわかりません。サンプル コードから始めたいと思います.... (ソケット、cURL、およびサーバー ソケットを備えた PHP サーバーにアクセスできるので、PHP サーバー コードもあれば幸いです...)
前もって感謝します。
編集:申し訳ありませんが、十分に明確ではありませんでした。穴あけの「仲介者」となる PHP サーバーの作成方法を知りたいです。PHPサーバーに接続できるJavaアプリケーションを作成し、別のJavaアプリケーションが同じポートの最初のアプリケーションに接続している間、その接続を維持する方法も知りたいです。(NATホールパンチングの仕組みについての私の印象です)
c++ - UDP NAT ホール パンチングの例
Google と here で検索を試みますが、単純な C\C++ の例の udp ホール パンチング アルゴリズムはまだ見つかりません。どこで見つけられるか分かる方教えてください。ありがとう!
networking - 異なる NAT 内の VM
ホール パンチングをテストするために、3 台のコンピューターをシミュレートして、全員が異なる NAT の背後にいるようにしたいと考えています。
そのアドレスが他の 2 つの VM に知られているサーバーが必要ですが、2 つの VM は別々の NAT にある必要があります。
ワークステーション 7 でこれを構成する方法についてのアイデアはありますか?
ありがとう :)
udp - udp ホール パンチとポート制限付きコーン NAT
ポート制限されたコーン NAT の背後にある 2 つのホストが接続を確立するときに、UDP ホール パンチングがどのように機能するかを理解したいと思います。
私が理解したように、それはいくつかの段階で発生し、3 つのホストが関与します。
ホスト A とホスト B は、ポート制限されたコーン NAT の背後にあります。
ホスト C は、ホスト A および B からパケットを受信できるサーバーです。
- A が C にパケットを送信します。
- C は A からパケットを受信し、A の外部アドレスとポートのペアを特定します
- B は C にパケットを送信します。
- C は B からパケットを受信し、B の外部アドレスとポートのペアを特定します
- C は B の外部アドレス:ポートを A に送信します。
- C は、A の外部アドレス:ポートを B に送信します。
- A は packet_1 を B の外部アドレスに送信します
- B は packet_2 を A の外部アドレスに送信します
質問は次のとおりです。
制限付きコーン NAT の背後にある A は、制限付きコーン NAT の背後にもある B からパケットを受信するにはどうすればよいですか?
ポート制限付きコーン NAT は、送信元アドレス: ポートのペアが、それによって送信されたパケットの宛先アドレス: ポートのペアと一致しないパケットの受信を許可しません。A と B の間で送信された他のパケットが A と B に到着するのはなぜですか?
ポート制限されたコーン NAT が packet_2 を B からの応答とみなすためでしょうか?
したがって、packet_1 は失われますが、packet_2 は B に到着します。
前もって感謝します。
c# - C#UDPは、データの送信にすでに使用されているポートでリッスンできませんか?
私はUDP/ネットワークプログラミングに不慣れで、UDPを介してチャットボードを作成しようとしています。
私の最終的な目的はUDPホールパンチング(Skypeと同様の概念)を実行することです。そのため、データの送信に使用されるポートと同じポートでリッスンする必要があります。そうしないと、NATが着信パケットをドロップします。
やってみました
しかし、データの送信に使用されたポートからデータを受信できません。
これは、リスナーの私のコードがどのように見えるかです(別のスレッドにあります)(Web上の別のチュートリアルから適応されています):
これは私の送信者です:
メソッドserver.Close()は、アプリケーションがユーザーによって終了された場合にのみ呼び出されます。
送信者のローカルポートを確認したところ、受信者のローカルポート「(int)e.Argument」が送信者のローカルポートと等しい場合にのみ、リスナーがリッスンに失敗することがわかりました。受信ポートを別のポートに設定すると、パケットを受信できます。
また、UdpClientごとにローカルポートが異なるため、UdpClientのインスタンスをこれ以上作成できません。そのため、穴あけを行うことができません。
私はすでに多くの場所を検索しましたが、誰もこの問題を抱えていないようです...
もっと簡単な方法があると思います...
caching - Magentoのフルページキャッシュを介して動的コンテンツをパンチパンチしようとしています
Magento Enterprise 1.10.1.1を使用していますが、製品ページで動的コンテンツを取得する必要があります。現在の時刻をブロックに挿入して、動作しているかどうかをすばやく確認していますが、ページ全体のキャッシュを通過できないようです。
私はここにあるさまざまな実装を試しました:
http://tweetorials.tumblr.com/post/10160075026/ee-full-page-cache-hole-punching http://oggettoweb.com/blog/customizations-compatible-magento-full-page-cache/ http:/ /magentophp.blogspot.com/2011/02/magento-enterprise-full-page-caching.html
任意の解決策、考え、コメント、アドバイスを歓迎します。
これが私のコードです:
app / code / local / Fido / Example / etc / config.xml
app / code / local / Fido / Example / etc / cache.xml
app / code / local / Fido / Example / Block / View.php
app / code / local / Fido / Example / Model / Container / Cachetest.php
app / design / frontend / entity / [mytheme] /template/example/view.phtml
app / design / frontend / entity /[mytheme]/layout/catalog.xmlからのスニペット
windows - TCPホールパンチング
mingwツールチェーンを使用してWindowsソケットでTCPホールパンチングを実装しようとしています。プロセスは正しいと思いますが、穴は取れていないようです。これを参考にしました。
- AとBはサーバーSに接続します
- SはA、BのルーターIP+ Sへの接続に使用したポートに送信します
- SはBについても同じことをします
- 開始2スレッド
:
- 1つのスレッドが、 Sから送信された情報を使用してBのルーターに接続しようとします
- もう一方のスレッドは、 Sに接続したときに、ルーターへの接続に使用されたのと同じポートで着信接続を待機しています。
- Bも同じことをします
私が思うコードには問題はありません:
- AとBはお互いにIPとポートを使用します
- 彼らは両方とも、サーバーに接続したときにルーターに接続するために使用したポートをリッスンしています
- それらは両方とも正しいIPとポートに接続していますが、タイムアウトになります(コードエラー
10060
)
私は何かが欠けていますか?
編集: Process Explorerの助けを借りて、クライアントの1つがピアへの接続を確立できたことがわかります。しかし、ピアは接続が確立されているとは見なしていないようです。
これが私がWiresharkでキャプチャしたものです。例として、サーバーSとクライアントAは同じPC上にあります。サーバーS8060
は、そのPCにリダイレクトされた特定のポート()でリッスンします。Bは、 Sによって送信されたAのパブリックアドレスがであることがわかり、代わりにSのパブリックIPを使用するため、引き続き正しいIPに接続しようとします。(パブリックIPをプレースホルダーに置き換えました)localhost
編集2:混乱は、着信接続要求データと発信接続要求データの両方が同じポートで転送されるという事実によるものだと思います。どのソケットがポートからデータを取得するかわからないため、これは接続状態を台無しにしているようです。msdnを引用すると:
SO_REUSEADDR
ソケットオプションを使用すると、ソケットを別のソケットが使用しているポートに強制的にバインドできます。2番目のソケットは、元のソケットと同じポートでbindを呼び出す前に、optnameパラメーターをに設定しSO_REUSEADDR
、optvalパラメーターをブール値に設定してsetsockoptを呼び出します。2番目のソケットが正常にバインドされると、そのポートにバインドされたすべてのソケットの動作は不確定になります。TRUE
しかし、同じポートで話すことは、穴を開けるためにTCPホールパンチング技術によって必要とされます!