AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Eigene IP Adresse ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene IP Adresse ermitteln

Ein Thema von Cicaro · begonnen am 18. Dez 2009 · letzter Beitrag vom 25. Feb 2016
Antwort Antwort
Seite 1 von 2  1 2      
Cicaro

Registriert seit: 9. Feb 2005
285 Beiträge
 
Delphi 7 Personal
 
#1

Eigene IP Adresse ermitteln

  Alt 18. Dez 2009, 13:32
Hallo.

Ich dachte so etwas sollte eigentlich leicht in einem Forum zu finden sein, aber ich habe nichts gescheites gefunden.

Einfache Aufgabe: IP Adresse in der eigenen Delphi Anwendung ermitteln. Ob Array von 4 Zahlen oder String ist egal. Möglichst kurz und einfach sollte es sein, damit man es verstehen kann.

a) Generel: Wie kommt man an die eigene IP in einer Konsolen-Anwendung.
b) Sockets: Also ich arbeite eigentlich mit TClientSocket/TServerSocket, die nicht auf der Form liegen. Wie kann man die IP mit Hilfe der Delphi Unit "ScktComp" ermitteln ?
c) Welche anderen Formen gibt es die IP zu ermitteln (z.B. Indy etc.)?

Folgendes bietet Java kurz und knackig an:
Delphi-Quellcode:
String[] strings = InetAddress.getLocalHost().toString().split("/");
String myIP = strings[strings.length - 1];
Warum auch nicht Delphi in vergleichbarer Form ?

Das hier hab ich schon gesehen. Bitte nicht so etwas anbieten.

MfG
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#2

Re: Eigene IP Adresse ermitteln

  Alt 18. Dez 2009, 14:15
HI,

kommt ganz darauf an, welche IP du haben willst. Die öffentliche IP (Internet) oder die private Adresse (lokales Netz). Die erstere bekommst du bei Seitenaufrufen auf Seiten, die dir deine IP verraten, letztere durch einen API-Aufruf.
Für letztere hast du ja schon einen Weg gefunden. Ich kann dir nur einen sehr ähnlichen oder fast den selben anbieten.

Die Seiten für die öffentliche IP bekommst du hier: http://www.delphipraxis.net/internal...=252395#252395 . Du kannst aber auch selbst ne Seite bauen, um dem Datenschutz besser folge zu leisten.

Bernhard

EDIT: Die angegebenen Links führten größtenteils zu 404-Seiten, also mal schnell:
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Eigene IP Adresse ermitteln

  Alt 18. Dez 2009, 14:44
Ich geh mal davon aus, es ist die Rede von der globalen IP Adresse, denn für die lokale gibts hier genug Sourcen.

Versuch mal whatismyipaddress.com in cmd anzupingen.
Falls das funktioniert, schreibe dir die IP dieser Seite auf und mache folgendes:
1. telnet <ip> 80
2. Nach Verbindungsaufbau folgendes tippen:
Code:
GET / HTTP/1.1<enter>
Host: <IrgendEineIP><enter>
<enter>
<enter>
Genau diesen Vorgang kannst du auch "automatisieren" / "programmieren".
Folgender Code dürfte solch eine Verbindung aufbauen, denn HTTP Request senden, Rückgabe-String parsen und dir deine globale IP Adresse als String zurückgeben.

Delphi-Quellcode:
uses WinSock2;

function GetWANIP(): String;
// whatismyipaddress.com -- 140.239.191.10
var
  WSAD: TWSAData;
  Sock: TSocket;
  Addr: TSockAddrIn;
  Timo: Cardinal;
  GetMsg: String;
  Buffer: Array[0..$400-1] of Char;
begin
  if WSAStartup( $202, WSAD ) = 0 then
  begin
    Sock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if Sock <> SOCKET_ERROR then
    begin
      Timo := $1000;
      setsockopt( Sock, SOL_SOCKET, SO_SNDTIMEO, pChar( @Timo ), SizeOf( Timo ) );
      with Addr do
      begin
        sin_family := AF_INET;
        sin_port := htons( 80 );
        sin_addr.S_addr := inet_addr( '140.239.191.10' );
      end;
      if connect( Sock, @Addr, SizeOf( Addr ) ) = 0 then
      begin
        GetMsg := 'GET / HTTP/1.1'#13#10+
                  'Host: 140.239.191.10'#13#10#13#10;
        Timo := Length( GetMsg );
        if send( Sock, GetMsg[1], Timo, 0 ) = Timo then
        begin
          FillChar( Buffer[0], $400, 0 );
          if recv( Sock, Buffer[0], $400, 0 ) > 0 then
          begin
            Result := Buffer;
            Timo := Pos( #13#10#13#10, Result );
            if Timo > 0 then
              Result := Copy( Result, Timo+4, 15 );
          end;
        end;
      end;
      closesocket( Sock );
    end;
    WSACleanup();
  end;
end;
MfG
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#4

Re: Eigene IP Adresse ermitteln

  Alt 18. Dez 2009, 15:15
Hallo Cicaro.

Zitat von Cicaro:
Möglichst kurz und einfach sollte es sein, damit man es verstehen kann.
Windows arbeitet mit Adaptoren, dh. Pro Netzwerkkarte gibt es einen Netzwerkadapter.
Es gibt Hardware und Software Adaptoren (virtuelle Adaptoren).
Virtuelle Adaptoren können mittels API in fast beliebiger Anzahl erstellt werden.
Jeder Adapter erhält eine MAC-Adresse und IP.
Also wenn Du die IP ermitteln möchtest, musst du wissen von welchem Adapter du diese auslesen willst.

Beispiel Notebook:
W-Lan, NIC, ISDN, ADSL, Firewalls, Virenscanner, BlueTooth usw.
Hier kann es möglich sein, dass bis zu 7 IP's (Adaptoren) vorhanden sind.

Also Kurz und einfach, ohne sich genauer mit der Materie zu beschäftigen, wirds nicht gehen!

Wenn Du Komponenten wie "ScktComp" verwendest, wird immer die IP des an den Adapter gebundenen Sockets ausgegeben.

Bei Verwendung von "komplizierter" Socket-API oder IPHelper-API ist es jederzeit möglich alle IP's korrekt zu ermitteln!

Oder man verwendet die "kurz und knackige Java Funktion", und weiss anschliessend nicht was man eigentlich getan hat!

Zitat von Cicaro:
Wie kommt man an die eigene IP in einer Konsolen-Anwendung.
Mit den genannten API's!

http://msdn.microsoft.com/en-us/library/aa366073(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Re: Eigene IP Adresse ermitteln

  Alt 24. Feb 2016, 15:15
Auf den Zug will/muss ich mal aufspringen:
... Also wenn Du die IP ermitteln möchtest, musst du wissen von welchem Adapter du diese auslesen willst.

Beispiel Notebook:
W-Lan, NIC, ISDN, ADSL, Firewalls, Virenscanner, BlueTooth usw.
Hier kann es möglich sein, dass bis zu 7 IP's (Adaptoren) vorhanden sind.

Also Kurz und einfach, ohne sich genauer mit der Materie zu beschäftigen, wirds nicht gehen!
Wie kann ich das herausfinden?
Ich brauche genau den Adaptor, mit dem ich im lokalen Netz verbunden bin. Folgende Funktion liefert mir zwar mehrere IP. Dass die letzte nicht immer die passende sein muss, ist mir dabei klar. Aber wie löse ich dieses Zuordnungsproblem?
Delphi-Quellcode:
Function GetLocalIP: String;
Type
   TaPInAddr      = Array [0..10] Of PInAddr;
   PaPInAddr      =^TaPInAddr;
Var
   Buffer         : PAnsiChar;
   aWSAData         : TWSAData;
   aHostEnt         : PHostEnt;
   pptr            : PaPInAddr;
   I               : Integer;
Begin
   Result:= '';
   Buffer:= Addr(Result[1]);
   If (WSAStartup($0101, aWSAData) = 0) Then
   Try
      If (GetHostName(buffer, MAX_PATH) <> 0) Then
      Begin
         aHostEnt:= GetHostByName(buffer);
         If (aHostEnt <> nil) Then
         Begin
            pPtr:= PaPInAddr(aHostEnt^.h_addr_list);
            I:= 0;
            While (pPtr^[I] <> nil) Do
            Begin
               Result:= String(inet_ntoa(pptr^[I]^));
               Inc(I);
            End;
         End;
      End;
   Finally
      WSACleanup;
   End;
End;
Ich habe übrigens 3 IP-Adressen: 1x LAN, 1x WLAN, 1x VirtualBox-Adapter. Das Problem dabei ist, dass ich an 2 Laptops mit gleicher Konfiguration unterschiedliche Ergebnisse bekomme. Ich vermute, dass es allein an der Installationsreihenfolge der Treiber liegt.

P.S. Ich finde übrigens diese überall zu findende Funktion nicht so furchtbar, dass man sich nach Java flüchten müsste.
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#6

AW: Eigene IP Adresse ermitteln

  Alt 24. Feb 2016, 17:46
Das Problem an deine Aufgabe ist, dass es nicht den Adapter mit der IP gibt.

Ein Adapter kann problemlos mehrere IPs haben. Und du kannst über mehrere Adapter auch mit mehreren Netzen verbunden sein. Du solltest immer davon ausgehen, dass sowas vorkommen kann. Bring deinem Programm bei, mit allen Umständen umgehen zu können. Es wäre unheimlich ärgerlich, wenn dein Programm nicht benutzbar wäre, weil du dachtes, es sei einfacher für den Benutzer, wenn er keinerlei Auswahlmöglichkeit hat.

Ansonsten, für einen "Einfachen Modus" oder als Standardauswahl: Nimm den Adapter mit dem Netz, der zuständig für die Standardroute (0.0.0.0 mit Maske 0.0.0.0) ist:

Code:
C:\Users\Valentin>route PRINT -4

[...]

IPv4-Routentabelle
===========================================================================
Aktive Routen:
     Netzwerkziel   Netzwerkmaske         Gateway   Schnittstelle Metrik
          0.0.0.0          0.0.0.0      192.168.1.1     192.168.1.50     10   <-- Standardroute mit Gateway- und Adapter-IP
        127.0.0.0        255.0.0.0   Auf Verbindung        127.0.0.1    306
        127.0.0.1  255.255.255.255   Auf Verbindung        127.0.0.1    306
  127.255.255.255  255.255.255.255   Auf Verbindung        127.0.0.1    306
      169.254.0.0      255.255.0.0   Auf Verbindung   169.254.168.57    266
   169.254.168.57  255.255.255.255   Auf Verbindung   169.254.168.57    266
  169.254.255.255  255.255.255.255   Auf Verbindung   169.254.168.57    266
      192.168.1.0    255.255.255.0   Auf Verbindung     192.168.1.50    266
     192.168.1.50  255.255.255.255   Auf Verbindung     192.168.1.50    266
    192.168.1.255  255.255.255.255   Auf Verbindung     192.168.1.50    266
        224.0.0.0        240.0.0.0   Auf Verbindung        127.0.0.1    306
        224.0.0.0        240.0.0.0   Auf Verbindung   169.254.168.57    266
        224.0.0.0        240.0.0.0   Auf Verbindung     192.168.1.50    266
  255.255.255.255  255.255.255.255   Auf Verbindung        127.0.0.1    306
  255.255.255.255  255.255.255.255   Auf Verbindung   169.254.168.57    266
  255.255.255.255  255.255.255.255   Auf Verbindung     192.168.1.50    266
===========================================================================
Ständige Routen:
  Keine
Obacht: es kann auch mehrere Standardrouten geben. Nimm die mit höchster Priorität (kleinster Metrik).
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog

Geändert von Valle (24. Feb 2016 um 17:49 Uhr)
  Mit Zitat antworten Zitat
BoolString

Registriert seit: 2. Feb 2009
Ort: Varel
70 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Eigene IP Adresse ermitteln

  Alt 24. Feb 2016, 18:46
Was ist mit so was:
code10.info IP Adapter

Hab so was vor Jahren auch mal gebraucht und dort öffentlich gestellt...

Jan
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Eigene IP Adresse ermitteln

  Alt 24. Feb 2016, 20:01
... Ansonsten, für einen "Einfachen Modus" oder als Standardauswahl: Nimm den Adapter mit dem Netz, der zuständig für die Standardroute (0.0.0.0 mit Maske 0.0.0.0) ist:
Code:
C:\Users\Valentin>route PRINT -4
(...)
Obacht: es kann auch mehrere Standardrouten geben. Nimm die mit höchster Priorität (kleinster Metrik).
Das gefällt mir.
Nach welchen Befehlen kann ich das mit Delphi realisieren? Wonach muss ich suchen?
Ich wollte das ungern über einen Shell-Aufruf mit anschließendem Einlesen und Auswerten einer externen Datei.

Was ist mit so was:
code10.info IP Adapter

Hab so was vor Jahren auch mal gebraucht und dort öffentlich gestellt...

Jan
So etwas weiß ich zu schätzen. Ich schaue mir das mal an. Metric scheint es in tNetworkInterface auf den ersten Blick dort nicht zu geben...

Danke soweit erstmal für Eure tollen Antworten!
Alex Winzer
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: Eigene IP Adresse ermitteln

  Alt 24. Feb 2016, 20:24
... Ich schaue mir das mal an...
Mit Copy & Paste kann man den Code schnell testen.
In Delphi XE5 hagelt es aber Hinweise bzgl. PChar und PAnsiChar sowie zu impliziten String-Umwandlungen. Ein paar schönheitsfehler im Code und am Ende dann aber der Punkt, dass die Funktion immer True zurückgibt. Gibt es dafür einen Grund?
Und am Ende werden von 5 Adaptern auch nur 2 gefunden, wobei der mit der richtigen IP fehlt.

Die von mir eingangs gepostete Funktion liefert das gebrauchte ja auch schon zurück. Ich muss also bloß herausfinden, was die höchste Metric hat, wie man das programmtechnisch mit Delphi umsetzt und dann wäre ich fertig.
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Eigene IP Adresse ermitteln

  Alt 18. Dez 2009, 15:36
a) Man nutzt die gleichen Möglichkeiten, wie in einer Formularanwendung. --> Frage ist obsolet
b) In dieser Unit gibt es dafür keine Funktionen oder Methoden
c) Mit Indy erstellst du dir ein Objekt von TidIPWatch und suchst dir die passende Methode.
d) Weitere Möglichkeiten wurden genannt oder finden sich u.a hier in der CodeLib

Edit:
Hier sind zwei Lösungen. Aber sie geben nur eine der möglichen IP'n wieder (siehe Astat).
Delphi-Quellcode:
var myIP:string;
begin
  //Variante 1 (idIPWatch)
  with TidIPWatch.create(nil) do
  begin
    myIP:=LocalIP;
    free;
  end;
  memo1.lines.add(myIP);

  // Variante 2 (scktcomp)
  with TClientsocket.Create(nil) do
  begin
    myIP:=inttohex(Socket.LookupName('').S_addr,8);
    free;
  end;
  memo1.lines.add(myIP);
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz