Wie kann man die eigene Internet-IP-Adresse ermitteln?
Hinweis
Mit Internet-IP ist die IP-Adresse gemeint, unter der ein entfernter Internet-Teilnehmer mein System (oder LAN, falls hinter einem Router) "sieht". Der Vorschlag arbeitet Web-basiert, läuft also nur mit einer aktiven Internetverbindung (andernfalls ist eine "öffentliche IP" ja auch nicht vorhanden/sinnvoll)!
Verwendete Komponenten / Dienste
Weiterhin wird die
Indy-Komponente IdHTTP,
TRegExpr, sowie eine Liste von IP-Detector-Diensten im Internet verwendet. Da hier grundsätzlich das Problem besteht, dass einer (oder im Extremfall alle) Dienste ausfallen, ist diese Liste der entscheidende Punkt an der vorgestellten Lösung. Weitere IP-Detector-Dienste können z.B. über Google gefunden werden:
MY IP
Vorsicht: wenn ein Proxy-System (müsste noch in IdHTTP konfiguriert werden, der IE-Proxy wird nicht automatisch verwendet) oder NAT-Router den Zugang zum Internet bündelt, dann wird dessen IP-Adresse geliefert!
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| uses ..., RegExpr, IdHttp, WinSock;
function GetInternetIP(out OutputIPorError: String): Boolean; const DetectorService: array[0..2] of String = ( 'http://www.whatismyip.com', 'http://www.wieistmeineip.de', 'http://www.heise.de/netze/tools/ip/' ); var RE: TRegExpr; IdHTTP: TIdHTTP; i: Integer; IP: in_addr; begin Result := FALSE; OutputIPorError := 'Unknown error'; RE := TRegExpr.Create; IdHttp := TIdHTTP.Create(NIL); try RE.Expression := '(\d{1,3}\.){3}\d{1,3}'; i := 0; while ( (NOT Result) and (i <= High(DetectorService)) ) do begin try Result := RE.Exec(IdHTTP.Get(DetectorService[i])); if Result then begin OutputIPorError := RE.Match[0]; IP.S_addr := inet_addr(PChar(OutputIPorError)); Result := (IP.S_addr <> INADDR_ANY); if Result then OutputIPorError := inet_ntoa(IP) else OutputIPorError := 'Invalid address: '+RE.Match[0]; end else OutputIPorError := 'IP address not found'; except OutputIPorError := Exception(ExceptObject).Message; end; Inc(i); end; finally IdHTTP.Free; RE.Free; end; end; |
Benutzung
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var Output: String; begin if GetInternetIP(Output) then Edit1.Text := Output else MessageDlg(Output,mtError,[mbCancel],0); end; |
Diese Lösung ist mehr als Demo der Technik zu verstehen, da zum Beispiel im Falle einer fehlenden Internetverbindung die Anwendung solange blockiert (IdHTTP verwendet blocking-socket-calls), bis alle IP-Detector-Dienste aus der Liste auf einen Fehler gelaufen sind. Deshalb befindet sich im Anhang eine threadbasierte Lösung als Unit, die mit einem Ergebnis-Ereignis arbeitet.
cu
Narses
There are 10 types of people - those who understand binary and those who don´t.