Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 01.07.07 13:03 
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: Suche bei Google 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!


ausblenden volle Höhe Delphi-Quelltext
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;

// Die öffentliche IP-Adresse ermitteln (Result: TRUE) oder einen Fehlertext
// liefern (Result: FALSE)
function GetInternetIP(out OutputIPorError: String): Boolean;
  const
    // Liste der verwendeten IP-Detector-Dienste; ggfs. erweitern
    DetectorService: array[0..2of 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; // Default-Ergebnis: Fehler
  OutputIPorError := 'Unknown error'// Default-Fehlertext: keine Details
  RE := TRegExpr.Create;
  IdHttp := TIdHTTP.Create(NIL);
  try
    RE.Expression := '(\d{1,3}\.){3}\d{1,3}'// vier 3stellige Zahlen mit Punkt
    i := 0;
    // solange noch keine IP-Adresse ermittelt wurde und noch ein Dienst da ist
    while ( (NOT Result) and (i <= High(DetectorService)) ) do begin
      try
        Result := RE.Exec(IdHTTP.Get(DetectorService[i])); // Seite holen und auswerten
        if Result then begin // wenn eine passende Zeichenfolge gefunden wurde
          OutputIPorError := RE.Match[0];
          IP.S_addr := inet_addr(PChar(OutputIPorError)); // in IPv4 (bin) wandeln
          Result := (IP.S_addr <> INADDR_ANY); // Adresse gültig?
          if Result then // ja, dann wieder
            OutputIPorError := inet_ntoa(IP) // in einen String umwandeln
          else
            OutputIPorError := 'Invalid address: '+RE.Match[0];
        end
        else
          OutputIPorError := 'IP address not found';
      except
        OutputIPorError := Exception(ExceptObject).Message;
      end;
      Inc(i); // nächsten Detector-Dienst abfragen
    end;
  finally
    IdHTTP.Free;
    RE.Free;
  end;
end;



Benutzung

ausblenden 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. :idea: ;)

cu
Narses


GetInetIP_Thread.zip  (2.26 KB) Download (Rev 0)
 (1352x, 1352x gesamt)
Beschreibung: Demoprojekt: threadbasierte Lösung
_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Jakane