Eigene IP Adresse

Alle Fragen zur Netzwerkkommunikation
ufkpra2
Beiträge: 32
Registriert: Fr 14. Mai 2010, 14:47
CPU-Target: i386
Wohnort: Ulm

Eigene IP Adresse

Beitrag von ufkpra2 »

Hallo.

Wie kann ich die IP Adresse des Rechners, auf dem mein Programm läuft, am einfachsten herausfinden (also möglichst ohne Zusatzbibliotheken a la lnet oder synapse)?

Vielen Dank schon mal!

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Eigene IP Adresse

Beitrag von theo »

Wahrsch. kannst du den Code da rausziehen (*Nix und Win):
http://www.silvioprog.com.br/downloads/SynapseGetIP.zip" onclick="window.open(this.href);return false;

Afaics benötigt das Synapse nur für die externe Variante.
Ansonsten brauchst du Synapse ja nicht in der IDE installieren, wäre also auch kein Problem.

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Re: Eigene IP Adresse

Beitrag von khh »

unter windows sollte das so funktionieren:

Code: Alles auswählen

function ipauslesen():string;
 
 
var
 
  rSockVer   : WordRec;
 
  aWSAData   : TWSAData;
 
  szHostName : array[0..255] of Char;
 
  pHE        : PHostEnt;
 
  sIP        : String;
 
begin
 
  // WinSock Version 1.1 initialisieren
 
  rSockVer.Hi := 1;
 
  rSockVer.Lo := 1;
 
  WSAStartup(Word(rSockVer), aWSAData );
 
  try
 
    FillChar(szHostName, SizeOf(szHostName), #0);
 
    GetHostName(szHostName, SizeOf(szHostName));
 
    pHE := GetHostByName(szHostName);
 
    if Assigned(pHE)
 
      then with pHE^ do
 
        sIP := Format(cTxtIP,
 
                [Byte(h_addr^[0]), Byte(h_addr^[1]),
 
                 Byte(h_addr^[2]), Byte(h_addr^[3])]);
 
  finally
 
    WSACleanup;
 
  end;
 
  result:= sIP;
 
end;

Gruss KHH

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Re: Eigene IP Adresse

Beitrag von Jay »

Andere Idee: führe einfach das Kommando ifconfig (Linux) bzw. ipconfig (Windows) in einem TProcess aus und parse dann einfach die entsprechenden Strings.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Eigene IP Adresse

Beitrag von theo »

@Jay und khh: Muss man eigentlich zu jeder vollständig beantworteten Frage noch einen Senf dazu geben, ohne die bereits angebotene Lösung wenigstens anzuschauen?
Eure beiden Varianten sind bereits in SynapseGetYourIP fertig vorhanden und Platform geswitcht.

khh
Beiträge: 489
Registriert: Sa 5. Apr 2008, 09:37
OS, Lazarus, FPC: Win Vista,Win 7 (L 0.9.29 FPC 2.4.1)
CPU-Target: 32Bit /64 Bit
Wohnort: Nähe Freiburg i.Br.

Re: Eigene IP Adresse

Beitrag von khh »

theo hat geschrieben:@Jay und khh: Muss man eigentlich zu jeder vollständig beantworteten Frage noch einen Senf dazu geben, ohne die bereits angebotene Lösung wenigstens anzuschauen?
Eure beiden Varianten sind bereits in SynapseGetYourIP fertig vorhanden und Platform geswitcht.
@theo, wenn ich jede Lösung die ein "Vorschreiber" mit irgendwelchen Links empfiehlt lesen lesen muss, bevor ich hier meinen eigenen "Senf" dazu gebe (geben darf), dann lasse ich es lieber ganz hier überhaupt zu antworten.

Ich hab den Tag über noch Anderes zu tun.

Die Qualität und die Frequentierung dieses Portals wird dadurch sicher nicht besser.
Es gibt zum Glück ja auch noch andere Portale, die, warum auch immer, bedeutend besser frequentiert sind :-)

bye

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Eigene IP Adresse

Beitrag von theo »

khh hat geschrieben: Es gibt zum Glück ja auch noch andere Portale, die, warum auch immer, bedeutend besser frequentiert sind :-)
Was bzw. welche meinst du damit?

ufkpra2
Beiträge: 32
Registriert: Fr 14. Mai 2010, 14:47
CPU-Target: i386
Wohnort: Ulm

Re: Eigene IP Adresse

Beitrag von ufkpra2 »

Danke für Eure Hilfe.

Wie ist denn der Bezeichner cTxtIP definiert?

@theo: ich denke, die meisten Hilfesuchenden sind durchaus über mehrere Antworten dankbar. ;-)

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Eigene IP Adresse

Beitrag von theo »

ufkpra2 hat geschrieben: @theo: ich denke, die meisten Hilfesuchenden sind durchaus über mehrere Antworten dankbar. ;-)
Naja, wenn die Antorten aber alle fast gleich sind bringt's ja nicht viel.
Bloss anschauen müsstest du sie halt, dann könntest du auch deine aktuelle Frage selber beantworten.

Auszug aus: SynapseGetIP.pas

Code: Alles auswählen

VHostEnt := GetHostByName(PChar(VName));
      with VHostEnt^ do
        Result := Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]),
          Byte(h_addr^[2]), Byte(h_addr^[3])]);
      WSACleanup;

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Re: Eigene IP Adresse

Beitrag von Jay »

theo hat geschrieben:Muss man eigentlich zu jeder vollständig beantworteten Frage noch einen Senf dazu geben, ohne die bereits angebotene Lösung wenigstens anzuschauen?
Hallo? Gehts noch? Achte mal bitte etwas auf deinen Umgangston. Meine Antwort war schließlich auch "nur" ein Lösungsansatz von vielen, welcher noch nicht genannt wurde... Außerdem ging es hierbei um eine Lösung die ohne die Verwendung von Zusatzbibliotheken auskommt. Da fand ich einfach nur TProcess ideal, da es zu den Standardkomponenten gehört und sowohl unter Linux als auch unter Windows zur Verfügung steht.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Eigene IP Adresse

Beitrag von theo »

Jay hat geschrieben: Hallo? Gehts noch? Achte mal bitte etwas auf deinen Umgangston.
Geht's dir noch? Noch nicht mal jetzt hast du dir obige Lösung angesehen. Ignoranz und Arroganz...

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Eigene IP Adresse

Beitrag von lrlr »

also mein PC hat ca. 5 "eigene IP adressen"
(davon keine einzige öffentliche)

ist halt die frage was man unter "eigene IP adresse" versteht...

@theo: allein das "wahrscheinlich" und "afaic" in deinem posting, weisen schon irgendwie darauf hin, dass es u.U. nicht vollständig beantwortet ist...

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Re: Eigene IP Adresse

Beitrag von Jay »

Zumindest unter Linux gäbe es noch die Möglichkeit, das Programm /sbin/ip zu verwenden (damit hat man dann die Daten aller Interfaces) und die Ausgabe dann zu parsen. Wäre zumindest einfacher als die Ausgabe von ifconfig zu parsen. Sowas könnte ich vielleicht hinbekommen. Ist nur die Frage, ob eine Linux-Version reicht (mit Windows kenne ich mich nicht ganz so gut aus - glaube allerdings nicht, dass es dort das selbe Kommando "ip" gibt).

Hier mal mein Prototyp-Beispiel, welches zur Zeit nur die Namen aller Netzwerkinterfaces unter Linux ermittelt (funktioniert nicht immer - verbesserungswürdig):

Code: Alles auswählen

unit ipget_utils;
 
{$mode objfpc}{$H+}
 
interface
 
uses
    Classes, SysUtils, Process;
 
type
    // Record für ein einzelnes Netzwerk-Interface
    TIPInterface = record
        IfID: Integer;     // Nummer des Interfaces
        IfName: String;    // Name des Interfaces (z.B. eth0)
        IfMac: String;     // Mac-Adresse des Interfaces
        IfState: Boolean;  // Status (UP = True /DOWN = False)
        IPv4addr: String;  // IP Version 4 Adresse
        IPv6addr: String;  // IP Version 6 Adresse
    end;
 
    // Container, der mehrere Interfaces enthalten kann
    TIPContainer = class(TObject)
    private
        FInterfaces: Array of TIPInterface;
        function GetIfCount: Integer;
        function GetIfName(AIndex: Integer): String;
    public
        constructor Create;
        function RefreshInterfaces: Boolean; // FInterfaces "Refreshen" - Rückgabewert: erfolgreich = true / nicht erfolgreich = false
        property InterfacesCount: Integer read GetIfCount; // Anzahl aller eingetragenen Interfaces
        property NameOfInterface[AIndex: Integer]: String read GetIfName; // Name des Interfaces ermitteln
        destructor Destroy;
    end;
 
implementation
 
constructor TIPContainer.Create;
begin
    inherited Create;
    SetLength(FInterfaces, 0);
end;
 
function TIPContainer.GetIfCount: Integer;
begin
    Result := Length(FInterfaces);
end;
 
function TIPContainer.GetIfName(AIndex: Integer): String;
begin
    Result := FInterfaces[AIndex].IfName;
end;
 
function TIPContainer.RefreshInterfaces: Boolean;
var
    TmpProcess: TProcess;
    TmpResult: Boolean;
    BytesAvailable: DWord;
    BytesRead: LongInt;
    Buffer1: String;
    Buffer2: String;
    Buffer3: String;
    ChrI, ChrP: Byte;
    I: LongInt;
    J, K, InterfaceIndex, InterfaceID: Integer;
    TmpIf: TIPInterface;
    TmpOutput: TStringList;
begin
    TmpProcess := TProcess.Create(nil);
    TmpProcess.CommandLine := '/sbin/ip -o addr';
    TmpProcess.Options := [poUsePipes,poNoConsole];
    Buffer1 := '';
    Buffer2 := '';
    TmpProcess.Execute;
    if TmpProcess.ExitStatus > -1 then begin
        TmpResult := True;
        while TmpProcess.Running = True do begin
            BytesAvailable := TmpProcess.Output.NumBytesAvailable; // warten bis etwas ausgegeben wurde
            while BytesAvailable > 0 do begin
                SetLength(Buffer1, BytesAvailable);
                BytesRead := TmpProcess.Output.Read(Buffer1[1], BytesAvailable);
                Buffer2 := Buffer2 + Copy(Buffer1, 1, BytesRead);
                BytesAvailable := TmpProcess.Output.NumBytesAvailable;
            end;
        end;
        TmpProcess.Free;
        TmpOutput := TStringList.Create;
        TmpOutput.Clear;
        Buffer3 := '';
        for I := 1 to Length(Buffer2) do begin
            // Vorparsen - Ausgabe filtern und in Stringliste laden
            if Buffer2[I] <> #10 then begin
                ChrI := Ord(Buffer2[I]);
                if (ChrI > 31) and (ChrI < 127) and ((ChrP <> 32) or (ChrI <> 32)) and (ChrI <> 92) then begin
                    Buffer3 := Buffer3 + Buffer2[I];
                    ChrP := ChrI;
                end;
            end else begin
                TmpOutput.Add(Buffer3);
                Buffer3 := '';
            end;
        end;
        if Buffer3 <> '' then
            TmpOutput.Add(Buffer3);
        // Parsen (Hauptteil)
        for I := 0 to TmpOutput.Count - 1 do begin
            // Interface ID ermitteln
            J := 1;
            Buffer3 := '';
            while (J <= Length(TmpOutput.Strings[I])) and (Ord(TmpOutput.Strings[I][J]) in [48..57]) do begin
                Buffer3 := Buffer3 + TmpOutput.Strings[I][J];
                Inc(J);
            end;
            if Buffer3 <> '' then begin
                // existiert das Interface bereits in der Liste?
                InterfaceIndex := -1;
                InterfaceID := StrToInt(Buffer3);
                if Length(FInterfaces) > 0 then begin
                    for K := 0 to High(FInterfaces) do begin
                        if FInterfaces[K].IfID = InterfaceID then begin
                            InterfaceIndex := K;
                            break;
                        end;
                    end;
                end;
                if InterfaceIndex > -1 then begin
                    // parsen für existierendes Interface
                    // FInterfaces[InterfaceIndex].{variable} ...
                end else begin
                    // neues Interface
                    K := Length(FInterfaces);
                    SetLength(FInterfaces, K + 1);
                    TmpIf.IfID := InterfaceID;
                    // parsen für neues Interface
                    J := J + 2;
                    // Name des Interfaces ermitteln
                    Buffer3 := '';
                    while (J < Length(TmpOutput.Strings[I])) and (Ord(TmpOutput.Strings[I][J]) in [48..57,65..122]) do begin
                        Buffer3 := Buffer3 + TmpOutput.Strings[I][J];
                        Inc(J);
                    end;
                    if Buffer3 <> '' then
                        TmpIf.IfName := Buffer3;
                    FInterfaces[K] := TmpIf;
                end;
                Buffer3 := '';
 
                // TODO: Weiter parsen
            end;
        end;
        TmpOutput.Free;
    end else
        TmpResult := False;
    Result := TmpResult;
end;
 
destructor TIPContainer.Destroy;
begin
    SetLength(FInterfaces, 0);
    inherited Destroy;
end;
 
end.
Zuletzt geändert von Jay am So 4. Jul 2010, 14:30, insgesamt 4-mal geändert.

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Eigene IP Adresse

Beitrag von carli »

Damit bekommst du aber nur die IP heraus, die der Router ihm im internen Netzwerk gibt.
Für die "echte" IP (die man weltweit im Internet hat), muss man einige Umwege gehen.
Am einfachsten ist der Weg über irgendwelche Chat-Server, die sagen einem meistens beim Login, welche IP man hat.
Man kann aber auch selbst nen simplen Server oder ein Webscript dafür schreiben.
Oder du fragst über http einfach http://whatismyip.org" onclick="window.open(this.href);return false; ab.

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Re: Eigene IP Adresse

Beitrag von Jay »

@carli: Ich dachte, der Threadstarter wollte die IP's der lokalen Netzwerkschnittstellen ermitteln. Zumindest hat sich das für mich so angehört...
Ansonsten muss man halt die Ausgabe eines Scripts oder eines anderen Programms parsen ;)

Antworten