Eigene IP Adresse
Eigene IP Adresse
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!
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!
Re: Eigene IP Adresse
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.
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.
-
- 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
unter windows sollte das so funktionieren:
Gruss KHH
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
-
- 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
Andere Idee: führe einfach das Kommando ifconfig (Linux) bzw. ipconfig (Windows) in einem TProcess aus und parse dann einfach die entsprechenden Strings.
Re: Eigene IP Adresse
@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.
Eure beiden Varianten sind bereits in SynapseGetYourIP fertig vorhanden und Platform geswitcht.
-
- 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
@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.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.
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
Re: Eigene IP Adresse
Was bzw. welche meinst du damit?khh hat geschrieben: Es gibt zum Glück ja auch noch andere Portale, die, warum auch immer, bedeutend besser frequentiert sind![]()
Re: Eigene IP Adresse
Danke für Eure Hilfe.
Wie ist denn der Bezeichner cTxtIP definiert?
@theo: ich denke, die meisten Hilfesuchenden sind durchaus über mehrere Antworten dankbar.
Wie ist denn der Bezeichner cTxtIP definiert?
@theo: ich denke, die meisten Hilfesuchenden sind durchaus über mehrere Antworten dankbar.

Re: Eigene IP Adresse
Naja, wenn die Antorten aber alle fast gleich sind bringt's ja nicht viel.ufkpra2 hat geschrieben: @theo: ich denke, die meisten Hilfesuchenden sind durchaus über mehrere Antworten dankbar.
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;
-
- 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
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.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?
Re: Eigene IP Adresse
Geht's dir noch? Noch nicht mal jetzt hast du dir obige Lösung angesehen. Ignoranz und Arroganz...Jay hat geschrieben: Hallo? Gehts noch? Achte mal bitte etwas auf deinen Umgangston.
Re: Eigene IP Adresse
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...
(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...
-
- 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
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):
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.
-
- 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
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.
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.
-
- 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
@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
Ansonsten muss man halt die Ausgabe eines Scripts oder eines anderen Programms parsen
