2

サーバーがあり、それに 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 実装が最​​善ですが、私が得たものを採用します!

4

5 に答える 5

3

TCPのファイアウォールを確実に突破する方法はわかりませんが、UDPトラフィックの同様の方法があり、十分に文書化されています。

于 2011-09-07T00:44:32.937 に答える
3

NATにTCPホールをパンチすることは、時々/しばしば可能です(それはNATの振る舞いに依存します)。これは簡単に学ぶことはできませんが、Practical JXTA II(Scribdでオンラインで入手可能)のNATトラバーサルに関する対応する章を読んで、解決すべき問題の性質を理解してください。

次に、これを読んでください。それはそれを書いた人から来ています:http://nutss.gforge.cis.cornell.edu/stunt.php(あなたの質問のリンクの1つ)。

私はC/C ++のスペシャリストではありませんが、解決すべき問題は言語固有ではありません。コードベースからTCPにアクセスできる限り、それで十分です。UDPトラバーサルの実装はTCPよりも簡単であることに注意してください。

これらのヒントがお役に立てば幸いです。

PS:私はソリューションのC /C++実装を知りません。Cornellのリンクに記載されているコードは、作成者が確認したとおりに機能していません。私はそれを自分で蘇生させようとしましたが、彼はそれが研究目的のために完全に調整されており、生産の準備ができているとはほど遠いことを私に知らせました。

于 2011-09-10T20:19:52.960 に答える
1

興味があるか役立つかもしれないプロジェクトへのいくつかのリンク:

于 2011-09-09T18:36:08.397 に答える
1

NAT ホール パンチング用のランデブー サーバーを探しています: NAT/ファイアウォールの背後にあるコンピューターがピアツーピア接続を確立するのを支援するために、パブリックにアクセスできる (NAT/ファイアウォールの背後にないか、適切に構成されている) サーバー。

UDP は、TCP よりもはるかに優れた結果を提供するため、NAT パンチングでより一般的です。UDP NAT ホール パンチングの明確で有益な説明は、ここにあります。

信頼できる通信が必要な場合は、UDP 経由で信頼できるプロトコルを使用できます。

  1. SCTP (ライブラリ) - 標準化されたもの、または
  2. 多くのカスタム プロトコルの 1 つです。たとえば、RakNet (私はこのライブラリを使用しました。これは非常に成熟しており、機能が豊富で、NAT パンチングの実装があります)、Enet、またはその他多数 (Q8)
于 2011-09-13T10:04:11.707 に答える
0

エフェメラルポートは、既知のサービスポートを介して開かれたセッションの存続期間中にのみ有効であるため、サーバーを介して中継する必要性を魔法のように排除することはありません。基本的に、エフェメラルポートはサーバーセッションに依存します。

サーバーを使用して、両方のクライアント間の通信を中継する必要があります。これは、プロキシサーバーとして機能します。1つのオプションは、SSHプロキシサーバーを介してSSHトンネルを設定し、セキュリティの利点を追加することです。

それでも、これはファイアウォールが接続をブロックしないことを保証するものではありません。これは、ファイアウォールの種類と構成によって異なります。ファイアウォールとして機能するほとんどの住宅用ルーターは、デフォルトですべての着信接続をブロックします。ほとんどの場合、ファイアウォールの背後にあるコンピューターはクライアントとしてのみ機能し、外部への接続を開始するため、これは通常は問題ありません。また、接続の開始をHTTP、HTTPS、FTP、SFTP、SSHなどの既知のサービスポートにのみ制限するものもあるため、この設定は異なります。プロキシサーバーが非既知のサービスポートを使用する場合、接続は次のようになります。ブロックされました。

ただし、ファイアウォールは送信トラフィックをブロックするように設定することもできます。これは企業ネットワークで最も一般的であり、リソースの使用を制御するために、Webサーバーへの直接接続やプロキシサーバーを介したすべてのルーティングさえ許可していません。

また、UPnPを使用してポートを動的に開く方法を調べることもできます。

于 2011-09-07T01:49:54.830 に答える