C#: Oeffentliche IP Adresse bestimmen
Vor einiger Zeit habe ich einen Artikel darüber geschrieben, wie man die Lokale IP Adresse bestimmen kann. Seit dem kamen immer wieder mal Anfragen nach der öffentlichen IP Adresse, also die Adresse, mit der wir durch das Internet unterwegs sind.
Bild 1: Aufbau eines gewöhnlichen Heimnetzwerks
Leider kann man diese IP Adresse nicht so einfach bestimmen, denn sobald ein Router im Spiel ist (und das ist er heutzutage in 98% der Fälle) ist man vom Internet getrennt.
Aber warum kann ich denn nun die öffentliche IP Adresse nicht auslesen?
Wenn ihr Bild 1 mal anschaut, werdet ihr feststellen, dass dieser Haushalt zwei Computer hat, die beide durch den Router in Internet kommen. (Ohne Router würde immer nur ein Computer gleichzeitig im Internet sein können) Aber wir haben vom Router nur eine Verbindung zum Internet. Das bedeutet, dass beide Rechner über die selbe Verbindung im Internet Surfen und auch beide die selbe IP Adresse in Internet haben.
Dies ist möglich, da der Router sich darum kümmert, dass jeder Rechner das bekommt was er will, dieser trennt das eigene Heimnetzwerk von dem öffentlichen Netzwerk (dem Internet) - somit weiß nur der Router welche IP wir nach außen hin haben, wir als einzelner Rechner kennen nur unsere Heimnetzadressen.
Wie kann ich nun meine öffentliche IP herausfinden?
Um dieses Ziel zu erreichen müssen wir uns leider Hilfsmittel bedienen. Die wohl einfachste Lösung ist es eine Seite im Internet danach zu "fragen" welche IP man hat, denn wenn wir über den Router auf eine Internetseite zugreifen, sieht die Internetseite nur die IP des Routers und das ist auch unsere Öffentliche IP.
Woher bekomme ich dieses Hilfsmittel?
Hier hat man zwei Möglichkeiten, erstens man kennt eine Internetseite die einem die IP Adresse anzeigt, oder man baut sich eine eigene. Denn der Aufwand dafür ist sehr gering, alles was man dafür benötigt ist ein einfaches PHP Skript:
$ip = getenv("REMOTE_ADDR");
print $ip;
Dieses Skript macht nichts anderes, als die IP Adresse des Aufrufers anzuzeigen und mehr benötigen wir ja auch nicht!
Dieses Skript speichert ihr nun in einer Datei namens "index.php" und speichert diese auf eurem Webserver. ACHTUNG: wenn ihr einen kostenlosen Webspace benutzt, kann es sein, dass der Anbieter automatisch bei einem Aufruf eigenen Code in eure Dateien schreibt, um zB. Werbung ein zublenden - ich empfehle euch einen eigenen, bezahlten Webspace zu nutzen oder auf fremde Dienste vertrauen.
Da ich diese Funktionalität auch öfters benötige habe ich mir schon ein solches Skript angelegt, dieses findet ihr unter http://myip.bigbasti.com - diese Adresse könnt ihr auch gerne in euren Programmen nutzen um eure IP zu bestimmen.
Nun müssen wir nur noch dieses Skript in unserem Programm abfragen. Und das geschieht sehr einfach mit einem HttpWebRequest - so als würde man eine ganz normale Webseite aufrufen (was wir ja auch tun!)
/// Diese Methode liefert durch einen Webrequest die Öffentlich IP Adresse dieses Computers
/// "provider">Die URL an die der Request gesendet werden soll. Bsp: http://myip.bigbasti.com
/// returns>String mit der Öffentlichen IP Adresse in Punktnotation oder null bei Fehler
public static String GetMyPublicIP(string provider)
{
try
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(provider);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
return reader.ReadToEnd();
}
catch (Exception e)
{}
return null;
}
Hier machen wir nichts anderes, als die Webseite auf zurufen, und das was sie ausgibt herunter zuladen und da das Einzige was sie ausgibt unsere IP ist müssen wir nichts mehr machen!
Die obere Funktion könnt ihr zum Beispiel so benutzen:
String myip = GetMyPublicIP("http://myip.bigbasti.com");
Im Prinzip gar nicht so komplex, die einzige Unbequemlichkeit bleibt aber natürlich der externe Dienst auf den man sich verlassen muss!
Problemberichte richtig machen
Aktuell habe ich mehrere Programme in der Testphase und immer wieder bekomme ich Nachrichten oder Tickets mit folgendem Inhalt.
Programm Funktioniert nicht, es kommt ein Fehler.
Manchmal würde ich da am liebsten irgendwas kaputt machen
Ich frage mich was ein Mensch der mir diese Nachricht zukommen lässt sich davon erhofft. Es ist so als wenn ich zum Arzt gehe, ihm sage "Ich habe Schmerzen, heilen sie diese bitte!" und mich erwartungsvoll vor ihn setze. Sein Gesicht möchte ich sehen.
Dabei ist es doch wirklich nicht schwer die wichtigsten Informationen zu geben, wenn man schon eine Nachricht / Ticket schreibt. Dieser Artikel wird wohl nichts wirklich neues enthalten, ich werde ihn aber als Referenz nutzen, da ich es leid habe jedes Mal den Usern alles von vorne erklären zu müssen!
Wenn Sie ein Fehlerbericht erstellen, gibt es nur ein paar wenige Punkte bzw. Regeln die man einhalten sollte um einen Entwickler glücklich zu machen:
1. Gab es einen Fehler? Wenn Ja was stand drin?
Wenn ein Fehler auftaucht, ist das was er sagt (Die Fehlernachricht) die entscheidende Information, um diesen lösen zu können. Deswegen muss der Fehlertext immer mit in die Nachricht an den Entwickler. Können Sie diesen Fehler erneut reproduzieren, oder taucht er 'zufällig' auf?
2. Wann oder wobei ist der Fehler aufgetreten?
Im Normalfall passiert ein Fehler nicht einfach so, meistens tauchen Fehler direkt nach einer Useraktion auf, deswegen ist es wichtig zu sagen, was man zuletzt oder in dem Moment gemacht hat. Beispiele: "Der Fehler kommt beim Starten des Programms" oder, "Der Fehler kam, nachdem ich auf 'Anmelden' geklickt habe". Wenn der Fehler 'einfach so' auftaucht dann sollte man dies natürlich ebenfalls erwähnen.
3. Ist es möglich ein Bild (Screenshot) von dem Fehler zu machen?
Ein Fehler ist nicht immer ein Fehler, es muss nicht immer eine Fehlermeldung geben, manchmal ist einfach nur etwas verschoben oder nicht da wo es sein soll (häufig bei Webanwendungen). Und auch hier gilt, ein Bild sagt mehr als tausend Worte! Macht einfach einen Screenshot, meist weiß der Programmierer schon nach einem Kurzen Blick was schief lief, statt eine 3 Seiten Fehlerbeschreibung - damit ist keinem geholfen.
4. Auf welchem Computer ist der Fehler aufgetreten?
Computer ist nicht gleich Computer, jeder Rechner ist anders und ein Fehler kann viele Ursachen haben, deswegen sollte man dem Entwickler mitteilen auf welchem System der Fehler kam. Dazu gehören folgende Informationen:
- Betriebssystem Version (inkl. Servicepacks & Updates)
- Architektur (32 oder 64 Bit)
- Prozessor, Arbeitsspeicher
- Haben Sie Administrator Rechte auf dem Rechner?
- Hat der Computer irgendwelche Besonderheiten?
Hier ein Beispiel eines vernünftigen Fehlerreports:
Hallo,
jedes Mal wenn ich in dem Programm XYZ auf den Button ABC klicke kommt folgende Fehlermeldung:
System.IO.FileNotFoundException {"Could not load file or assembly 'Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. The system cannot find the file specified.":"Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342"}
Mein Computer ist ein Core2Duo 2,2 Ghz, 4 GB RAM mit Windows 7 (32 Bit), ich verfüge über keine Administrator Rechte!
MfG, Bla
Wie man sieht ist es wirklich nicht viel und ist in wenigen Momenten erledigt! Der Entwickler weiß nun genau wann und wo der Fehler auftaucht ist und kann sich an die Lösung machen!
Ich bitte euch alle, die schon angeschlagenen Nerven der Entwickler zu schonen und diese einfachen Regeln einhalten.
Wenn ihr noch einen wichtigen Punkt habt, den ich hier nicht aufgeführt habe bitte kommentieren.
