3 Stimmen

Hinzufügen einer NAT UPnP-Zuordnung in einem komplexen Netzwerk mit C#

Ich erstelle eine Anwendung, die auf Verbindungen (Server) von einer anderen Anwendung (Client) über eine TCP-Verbindung wartet. Wenn sich also beide Anwendungen im selben Netzwerk befinden, wird es einfach sein, die Verbindung herzustellen. Ich versuche also, dem Server eine Methode hinzuzufügen, damit die Benutzer keine Ports auf ihren Routern öffnen müssen, damit die Anwendung funktioniert, wenn sie über das Internet verwendet wird:

1)---------------------------------------------------SCENARIO_1-------------------------------------------------------------

der Server ist ein Computer in einem Haus. Dieser Computer ist mit einem Router verbunden und dieser Router ist mit dem Internet verbunden. Der Client ist ein Computer in einem Büro, der ebenfalls Zugang zum Internet hat.

Damit dieses Szenario funktioniert, musste ich früher die Ports am Hausrouter öffnen und an den Servercomputer weiterleiten. Auf dem Client musste ich nur die richtige IP-Adresse und denselben Port angeben, um die Verbindung herzustellen.

Jetzt habe ich das Öffnen der Ports auf dem Hausrouter mit einer wirklich coolen Technik vermieden:

Ich füge zunächst diesen Hinweis hinzu:

enter image description here

Dann teile ich dem Router mit, welche Ports an meinen Computer (den Server) weitergeleitet werden sollen:

    NATUPNPLib.UPnPNATClass upnpnat;
    NATUPNPLib.IStaticPortMappingCollection mappings;

    public ServerExample()
    {
        InitializeComponent();

        //                           server local IP address
        mappings.Add(1300, "TCP", 1300, "192.168.0.120", true, "my server");
        //.... etc
       ..

Wenn ich dies tue, kann ich von meinem Bürocomputer aus eine Verbindung herstellen, indem ich Port 1300, die WAN-IP-Adresse des Servercomputers, der ein anderer ist, eingebe. (Diese Adresse finden Sie unter: whatismyipaddress.com) Das Coole daran ist, dass ich keine Konfiguration am Router vornehmen muss!!!

2)-----------------------------------------------SCENARIO_2----------------------------------------------

Ich weiß, hier kommt mein Problem. Der Server befindet sich zufällig in einem Büro. Dieser Server ist mit Router A verbunden, Router A ist mit Router B verbunden und Router B ist mit dem Internet verbunden. Der Client befindet sich an einem anderen Ort. Es ist uns egal, wie das Netzwerk auf dem Client-Computer eingerichtet ist, solange er Zugang zum Internet hat.

Ich habe das Problem gelöst, indem ich die Pakete von Router x an den Servercomputer weitergeleitet habe und den Datenverkehr von Port x von Router B an die IP-Adresse von Router A weitergeleitet habe. Bei dieser Konfiguration konnte ich eine Verbindung mit dem Client herstellen, wenn ich die WAN-IP-Adresse des Servers angegeben habe. (die IP-Adresse, die unter whatismyipaddress.com angezeigt wird, wenn sie aus dem Büronetzwerk abgerufen wird).

Es wäre also schön, wenn ich diese ganze Konfiguration auf den Routern vermeiden und etwas Ähnliches tun könnte:

    public delegate void SomeDelegate(string parameters);

    NATUPNPLib.UPnPNATClass upnpnat;
    NATUPNPLib.IStaticPortMappingCollection mappings;

    public ServerExample()
    {
        InitializeComponent();

        //                           server local IP address
        mappings.Add(1300, "TCP", 1300, "192.168.150.141", true, "my server");
        mappings.Add(1300, "TCP", 1300, "another ip", true, "router's ip");

Ich habe also damit herumgespielt und konnte es nicht zum Laufen bringen. Außerdem wäre es schön, wenn ich herausfinden könnte, ob die Serververbindung wie Szenario 1 mit c# oder Szenario 2 oder vielleicht ein anderes Szenario ist, damit die Benutzer, die den Server einrichten, nicht all diese Informationen angeben müssen. ich bin mir zum Beispiel sicher, dass Limewire etwas Ähnliches macht.


Bearbeiten:

Hier ist Szenario 1 dargestellt:

enter image description here

und hier ist Szenario 2 dargestellt

enter image description here

4voto

Chris Haas Punkte 50077

Die Funktion, die Sie verwenden, heißt Universelles Plug & Play (UPnP) was im Grunde eine Möglichkeit für ein Gerät ist, einem anderen Gerät mitzuteilen, wie es mit ihm kommunizieren soll. Sie weisen einen Computer an, dem Router mitzuteilen, welche Ports Sie an ihn weiterleiten möchten. Leider ist UPnP ein nicht routingfähiges Protokoll, was bedeutet, dass es nicht über Router hinweg eingesetzt werden kann. Die kurze Antwort lautet also, dass das, was Sie versuchen wird nicht mit mehreren Routern arbeiten, ohne die am weitesten vom Client entfernten Router manuell zu konfigurieren.

Es pourrait möglich sein, etwas zu tun mit Internet-Gateway-Geräteprotokoll (IDG) aber dazu müssten Sie mehr recherchieren, und die Bibliothek, auf die Sie abzielen, unterstützt das nicht. Stellen Sie diese Frage an Server-Fehler und Sie erhalten vielleicht eine bessere Antwort. (Poste nicht deinen Code, sondern erkläre nur die Grundlagen deines Problems, nämlich dass du versuchst, ein Gerät mit UPnP bei einem Router anzumelden, was auch funktioniert, du aber einen anderen Router davor hast, den du auch automatisch weiterleiten möchtest).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X