Dienstag, 22. Juni 2010

Online (WAN) IP-Adresse ermitteln

Im vorigen Post habe ich gezeigt, wie man die IP-Adresse des Rechners im lokalen Netzwerk, im LAN (Local Area Network), auslesen konnte.
In diesem Post geht es nun darum, wie man die globale online IP-Adresse des Rechners ermitteln kann. Im Internet hat jeder Rechner auch eine eigene IP-Adresse, mit der er identifiziert werden kann, zur Kommnunikation im Internet ist diese entscheidend und nicht die lokale. Die online IP wird auch WAN (Wide Arena Network) IP-Adresse genannt.
Zu beachten ist aber, dass die IPs pro Router vergeben werden, hängen also mehrere PCs hinter einem Router, haben alle dieselbe IP-Adresse.
Auch nach längerer Suche habe ich für diese Aufgabe keine in .Net enthaltene spezielle Funktion entdeckt - also müssen wir zum Auslesen der IP mit C# etwas tricksen.
Es gibt Webseiten, wie z.B. http://www.wieistmeineip.de/, die die online IP ermitteln.
Mit unserer C# - Anwendung lesen wir nun einfach eine solche Webseite aus.
Das folgende Beispiel benutzt einen Webclient, der den Quellcode der Seite herunterlädt.
Im Quellcode steht die IP-Adresse im folgenden Format:
<h1 class="ip">xx.xxx.xxx.xxx</h1>.
Das Programm sucht daher im Quellcode nach dem Auftreten des Strings <h1 class="ip"> und ab dieser Position nach dem Auftreten des Strings </h1>.
Der String zwischen diesen beiden Stellen ist dann die gesuchte IP-Adresse:

System.Net.WebClient IPGetter = new System.Net.WebClient();
// Quellcode der Seite herunterladen und in SourceCode speichern
string SourceCode = IPGetter.DownloadString(@"http://www.wieistmeineip.de/");

// Auftreten der Formattierung für die IP-Adresse suchen
int IPStartPosition = SourceCode.IndexOf("class=\"ip\">");
// ab dem Auftreten nach schließendem Tag suchen
int IPEndPosition = SourceCode.IndexOf(@"</h1>", IPStartPosition);
// String zwischen beiden Positionen ist die gewünschte IP-Adresse
string IP = SourceCode.Substring(IPStartPosition + ("class=\"ip\">").Length, IPEndPosition - (IPStartPosition + ("class=\"ip\">").Length));

Kommentare:

  1. OUCH!

    string stringIP = null;
    IPHostEntry HostEntry = Dns.GetHostEntry(Dns.GetHostName());
    if (HostEntry.AddressList.Length > 0)
    {
    foreach (IPAddress ip in HostEntry.AddressList)
    {
    Console.WriteLine(ip.ToString());
    }
    }

    AntwortenLöschen
  2. Wie soll man denn darüber die WAN IP auslesen können?
    Deinen Beispielcode habe ich auch auf http://csharp-tricks.blogspot.com/2010/06/netzwerk-ip-adresse-ermitteln.html beschrieben, allerdings werden hierbei die IP Adressen aller Netzwerkadapter am PC ausgelesen, also LAN Karte, WLAN etc ...
    Wie auch oben im Post beschrieben ist die WAN IP aber eine globale IP, die nicht einem Rechner, sondern einem Router zugeordnet wird, wenn dieser sich in das Internet einwählt.
    Diese IP wird mit obigem Code ausgelesen.

    AntwortenLöschen
  3. gibt es eine möglichkeit ohne externe anbieter die IP adresse zu ermitteln?

    AntwortenLöschen
  4. Meines Wissens nein, zumal die WAN IP ja nicht auf dem eigenen Rechner definiert wird sondern über den Router, über den der PC Zugang zum Internet hat. Da diese Strecke ja unter Umständen recht lang sein kann, würde ich behaupten, dass diese IP zu ermitteln ohne externe Anbieter nicht geht.
    Falls doch - immer her mit dem Code!

    AntwortenLöschen
  5. Kann man die wanip ermitteln und dann an ein Server programm beispielsweise in einer anderen Stadt verschicken ? wenn ja wie ?

    AntwortenLöschen
  6. Es gibt einen besseren Dienst als "wieistmeineip.de". "whatismyip.org" liefert nur die IP-Adresse.

    using(WebClient client = new WebClient())
    {
    string ipString = client.DownloadString(
    "http://whatismyip.org/");
    IPAddress wanIP = IPAddress.Parse(ipString);
    }

    AntwortenLöschen
  7. Die IP wird hier aber als Bild ausgegeben. glaube, die steht nicht im Quelltext

    AntwortenLöschen
  8. Ich habe mir den Quellcode von whatismyip.org einmal angesehen. Er ist recht kurz, wodurch es für jeden einfach ist den Punkt zu finden. Es wird nur etwas namens "ipimg.php" aufgerufen.

    AntwortenLöschen
  9. Kennt jemand einen Weg, wie ich die WAN IP über ein C# Programm ändern kann? Es soll also beim starten dem Router das Signal geben, dass er eine neue IP anfordern soll (so wie man es über der Router verwaltung machen kann, eben nur automatisch). Ich bin über WLAN verbunden (falls das wichtig ist). Die Routerverwaltung muss mit einem Benutzernamen und Passwort aufgerufen werden (wenn man es über diese machen muss).
    Ich würde mich freuen, wenn mir dafür jemand eine Anleitung geben kann.

    AntwortenLöschen
  10. Weniger Text, dadurch schneller Ladezeiten hat
    http://www.myip.ch/
    (Wer hats erfunden ;)

    System.Net.WebClient IPGetter = new System.Net.WebClient();
    string SourceCode = IPGetter.DownloadString(@"http://www.myip.ch/");
    char[] splitter = new Char[] { '\r', '\n' };
    string[] LinesOfSourceCode = SourceCode.Split(splitter, StringSplitOptions.RemoveEmptyEntries);
    string stopWord = "Current IP Address: ";
    string IP = "";
    foreach (String line in LinesOfSourceCode)
    if (line.Contains(stopWord))
    {
    IP = line.Replace(stopWord, "");
    break;
    }

    AntwortenLöschen
  11. Zum Kommentar vom 22. September 2012 23:36

    Das geht, dazu muss dein Router UPnP unterstützen. Dazu muss du eine bestimmt formatierte HTTP-Anfrage an deinen Router stellen, dieser trennt deine momentane Verbindung (falls momentan eine Verbindung besteht) und stellt Sie wieder her. Wie die HTTP-Anfrage aussehen muss, bitte dazu Google konsultieren.

    Übrigens: Meines Wissen lässt sich über UPnP sogar die WAN-IP-Adresse auslesen. Wieder über eine bestimmte HTTP-Anfrage.

    Diemal mithilfe der Funktion UploadString
    IPGetter.UploadString("(Routeraddresse)", "POST", data);

    AntwortenLöschen
  12. Mittlerweile geht das noch schneller

    var ipGetter = new WebClient();

    string sourceCode = ipGetter.DownloadString(@"http://www.realip.info/api/p/realip.php");

    labelOnlineIp.Text = sourceCode.Replace("{\"IP\":\"", "").Replace("\"}", "");

    AntwortenLöschen