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:
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:
und hier ist Szenario 2 dargestellt