[c#] UDP-Lochstanzhilfe



Answers

STUN ist eine beste Lösung für das Problem. Es funktioniert für die meisten Szenarien. Es gibt ein einfaches Beispiel (C #), das Ihnen den NAT-Typ, lokale IP: Port und öffentliche IP: Port gibt.

       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());
        }

Sie können einfach einige Haltepunkte hinzufügen und das Verhalten des Codes überprüfen.

Sie können NAT auch mit vs2010 onwords (.net4.0 <) durchsuchen. Es gibt eine Methode AllowNATTraversal (Bool-Wert). Setzen Sie den Wert für NAT-Travers auf true. Es verwendet IPv6-Adresse für die Konnektivität. Sie können Ipv6 globale Adresse von "Teredo" Server erhalten, indem Sie einige Befehle in der Eingabeaufforderung schreiben. Tatsächlich ist IPV6 die Technologie, die verwendet wird, um dieses Problem zu vermeiden.

Question

Ich versuche, mit Peer to Peer Networking über das Internet zu meinem Spiel hinzuzufügen. Ich habe bereits eine Nur-LAN-Version implementiert, die die Peer-to-Peer-Klassen von .NET für die Verbindung innerhalb des lokalen Netzwerks verwendet.

Ich erkannte, dass ich UDP-Lochung verwenden muss, um eine Verbindung zu anderen Clients herzustellen, die sich hinter einer Firewall befinden.

So habe ich angefangen, es zu implementieren: Der Server ist ein HTTP-Server, der sehr einfache PHP-Skripte verwendet, um die Arbeit zu erledigen.

    • Registrieren Sie den Namen auf dem Server und senden Sie die private IP-Adresse und den Port als eine GET-Variable
    • Wenn der Server eine Registrierungsanforderung erhält, werden der öffentliche Endpunkt und der private Endpunkt gespeichert
    • Anfrage zur Verbindung mit einem anderen Client.
    • Der Server gibt die privaten und öffentlichen Endpunkte des Clients zurück
    • alle zwei Sekunden meldet sich der zweite Client beim Server an, und wenn ein anderer Client versucht, sich mit ihm zu verbinden, erhält er auch seine Endpunkte
    • Beide Clients beginnen mit dem Spammen der öffentlichen Endpunkte, bis sie eine gültige Antwort erhalten

Jetzt habe ich eine Menge Fragen

  1. Kann der Server ein HTTP-Server sein?
  2. Wenn ich eine Anfrage an einen HTTP-Server mache, ändert sich der Client-Port jedes Mal, wenn eine Anfrage gestellt wird. Wird ein privater Endpunkt immer demselben öffentlichen Endpunkt zugeordnet?
  3. Muss die Anfrage an den Server denselben Quellendpunkt haben wie die UDP-Nachrichten an den Client?
  4. Gibt es eine Möglichkeit, mit einem angegebenen Quellendpunkt eine Verbindung zu einem HTTP-Server in C # herzustellen?
  5. Gibt es Probleme mit meiner Implementierung?

Vielen Dank!






Links