4

Peer to Peerを使用して、インターネットを介したネットワークをゲームに追加しようとしています。.NETのピアツーピアクラスを使用してローカルネットワーク内で接続するLANのみのバージョンをすでに実装しています。

ファイアウォールの背後にある他のクライアントへの接続を確立するには、UDPホールパンチングを使用する必要があることに気付きました。

これが私がそれを実装し始めた方法です:サーバーは仕事を成し遂げるために非常に単純なPHPスクリプトを使用するHTTPサーバーです。

    • サーバーに名前を登録し、プライベートIPアドレスとポートをGET変数として送信します
    • サーバーが登録要求を受け取ると、パブリックエンドポイントとプライベートエンドポイントが保存されます
    • 別のクライアントへの接続を要求します。
    • サーバーはクライアントのプライベートエンドポイントとパブリックエンドポイントを返します
    • 2秒ごとに、2番目のクライアントがサーバーにチェックインし、サーバーに接続しようとしている別のクライアントがある場合は、そのエンドポイントも取得します。
    • 両方のクライアントは、有効な応答が得られるまで、パブリックエンドポイントを互いにスパムし始めます

今、私はたくさんの質問があります

  1. サーバーをHTTPサーバーにすることはできますか?
  2. HTTPサーバーにリクエストを送信すると、リクエストが行われるたびにクライアントポートが変更されます。プライベートエンドポイントは常に同じパブリックエンドポイントと一致しますか?
  3. サーバーへのリクエストには、クライアントへのUDPメッセージと同じソースエンドポイントが必要ですか?
  4. 指定されたソースエンドポイントを使用してC#でHTTPサーバーに接続する方法はありますか?
  5. 私の実装に問題はありますか?

ありがとう!

4

2 に答える 2

3

UDPホールパンチングは複雑なトピックであり、機能するソリューションを見つけるために多くの試みがなされてきました。問題は、そこには非常に多くの異なるNATルーターがあり、NATを実装する標準的な方法がないため、すべてのルーターの動作が少し異なることです。

STUNICEなど、いくつかの試みが標準化されています。それらはまだほとんどの場合にのみ機能しますが、すべてではありませんが、多くの知識を蓄積し、多くの懸念に対処します-太陽の下ですべてのNATルーターでソリューションをテストできないという理由だけで、これまでにないほど多くのことが可能になります。たとえば、Skypeは、NATトラバーサルメカニズムの完成に何年も費やしました。

STUNまたはできればICEをご覧になることをお勧めします。それらの1つを実装するか、既存の実装を探してみてください。

もう1つのオプションは、 UPnPまたはNAT-PMPを使用するなど、ルーターでポートフォワードを作成することです。

とはいえ、.NETピアツーピアクラスにNATトラバーサルメカニズムが付属していても驚かないでしょうが、私はそれらに精通していません。

于 2011-07-22T18:34:19.553 に答える
0

STUNはこの問題の最善の解決策です。ほとんどのシナリオで機能します。NATタイプ、ローカルIP:ポートおよびパブリックIP:ポートを示す簡単な例(C#)を次に示します。

       try
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            socket.Bind(new IPEndPoint(IPAddress.Any, 0));

            STUN_Result result = STUN_Client.Query("stunserver.org", 3478, socket);
            Console.WriteLine("Net Type : " + result.NetType.ToString());
            Console.WriteLine("Local IP : " + socket.LocalEndPoint.ToString());
            if (result.NetType != STUN_NetType.UdpBlocked)
            {
                Console.WriteLine("Public IP : " + result.PublicEndPoint.ToString());
            }
            else
            {
                Console.WriteLine("");
            }
        }
        catch (Exception x)
        {
            Console.WriteLine(x.StackTrace.ToString());
        }

いくつかのブレークポイントを追加して、コードの動作を確認するだけです。

また、vs2010 onwords(.net4.0 <)を使用してNATをトラバースすることもできます。AllowNATTraversal(ブール値)メソッドがあります。NATトラバースの値をtrueに設定します。接続にIpv6アドレスを使用します。コマンドプロンプトでいくつかのコマンドを記述することにより、「Teredo」サーバーからIpv6グローバルアドレスを取得できます。実際、IPV6は、この問題を回避するために使用されるテクノロジーです。

于 2014-04-30T10:12:33.837 に答える