Hallo, Linux mal wieder ! .. und meine Lösung für meinen Raspi mit Stretch.
function GetIpAddr(): string;
var
AProcess : TProcess;
s : string;
sl : TStringList;
i, n : integer;
k : integer;
begin
Result :='';
sl := TStringList.Create();
AProcess := TProcess.Create(nil);
AProcess.CommandLine := '/sbin/ifconfig';
AProcess.Options := AProcess.Options + [poUsePipes, poWaitOnExit];
try
AProcess.Execute();
sl.LoadFromStream(AProcess.Output);
except
end;
AProcess.Free();
for i:=0 to sl.Count-1 do
begin
n := Pos('inet ', sl);
if n=0 then Continue;
s := sl;
s := Copy(s, n+Length('inet '), 999);
Result := {Result +} Trim(Copy(s, 1, Pos(' ', s)));
// ausgeblendete Result ist jetzt 127.0.0.0
// Result := Result + Trim(Copy(s, 1, Pos(' ', s))) + ' ';
Result := {Result +} Trim(Copy(s, 1, Pos(' ', s))) + ' ';
end;
sl.Free();
end;
Synapse : Stretch : Eigene IP-Adresse ermitteln
- af0815
- Lazarusforum e. V.
- Beiträge: 6763
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Synapse : Stretch : Eigene IP-Adresse ermitteln
Zu dem Thema habe ich im Englischen Forum ein paar gute Tips bekommen, wie es ohne TProzess geht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Synapse : Stretch : Eigene IP-Adresse ermitteln
Hi,
ifconfig ist in neueren Distros nicht mehr enthalten!
Man kann die Netzwerkeinstellungen relativ einfach einlesen:
ifconfig ist in neueren Distros nicht mehr enthalten!
Man kann die Netzwerkeinstellungen relativ einfach einlesen:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
txt:string;
begin
{$IFDEF Linux}
RunCommand('ip', ['a'], txt);
{$ELSE}
RunCommand('ipconfig', [''], txt);
{$ENDIF}
showmessage (txt);
end;
Gruß, Michael
- af0815
- Lazarusforum e. V.
- Beiträge: 6763
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Synapse : Stretch : Eigene IP-Adresse ermitteln
Hier meine Testunit, alle Routinen mit 'Bu' werden von Buttons aufgerufen. Es sind die gesammelten Werke aus dem Thread http://forum.lazarus.freepascal.org/ind ... #msg308368 im Enlischen Forum. Es geht hier speziell um den RasPi.
Es wird Synapse aus dem OPM vorausgesetzt.
Es wird Synapse aus dem OPM vorausgesetzt.
Code: Alles auswählen
unit main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
BuGetIP: TButton;
BuGetIPList: TButton;
BuGetIPSyna: TButton;
BuGetInetsocket: TButton;
Memo1: TMemo;
procedure BuGetInetsocketClick(Sender: TObject);
procedure BuGetIPClick(Sender: TObject);
procedure BuGetIPListClick(Sender: TObject);
procedure BuGetIPSynaClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
uses
Process, synamisc, sockets, ssockets;
{$R *.lfm}
function GetIPAddress: string;
var
theProcess: TProcess;
AddressString: AnsiString;
begin
try
theProcess := TProcess.Create(nil);
theProcess.Executable := 'hostname';
//theProcess.Parameters.Add('-I');
theProcess.Parameters.Add('--all-ip-addresses');
theProcess.Options := [poUsePipes,poWaitOnExit];
theProcess.Execute;
if theProcess.Output.NumBytesAvailable > 0 then
begin
SetLength(AddressString{%H-}, theProcess.Output.NumBytesAvailable);
theProcess.Output.ReadBuffer(AddressString[1], theProcess.Output.NumBytesAvailable);
end;
GetIPAddress := AddressString;
finally
theProcess.Free;
end;
end;
function GetIpAddrList: string;
var
AProcess: TProcess;
s: string;
sl: TStringList;
i, n: integer;
begin
Result:='';
sl:=TStringList.Create();
{$IFDEF WINDOWS}
AProcess:=TProcess.Create(nil);
AProcess.Executable := 'ipconfig.exe';
AProcess.Options := AProcess.Options + [poUsePipes, poNoConsole];
try
AProcess.Execute();
Sleep(500); // poWaitOnExit not working as expected
sl.LoadFromStream(AProcess.Output);
finally
AProcess.Free();
end;
for i:=0 to sl.Count-1 do
begin
if (Pos('IPv4', sl[i])=0) and (Pos('IP-', sl[i])=0) and (Pos('IP Address', sl[i])=0) then Continue;
s:=sl[i];
s:=Trim(Copy(s, Pos(':', s)+1, 999));
if Pos(':', s)>0 then Continue; // IPv6
Result:=Result+s+' ';
end;
{$ENDIF}
{$IFDEF UNIX}
AProcess:=TProcess.Create(nil);
AProcess.Executable := '/sbin/ifconfig';
AProcess.Parameters.Add('-a');
AProcess.Options := AProcess.Options + [poUsePipes, poWaitOnExit];
try
AProcess.Execute();
sl.LoadFromStream(AProcess.Output);
finally
AProcess.Free();
end;
for i:=0 to sl.Count-1 do
begin
n:=Pos('inet ', sl[i]);
if n=0 then Continue;
s:=sl[i];
s:=Copy(s, n+Length('inet '), 999);
Result:=Result+Trim(Copy(s, 1, Pos(' ', s)))+' ';
end;
{$ENDIF}
sl.Free();
end;
{ TForm1 }
procedure TForm1.BuGetIPClick(Sender: TObject);
var
str : String;
begin
Memo1.Append('--- GetIPAddress (with hostname)---');
str := GetIPAddress;
Memo1.Append(str);
end;
procedure TForm1.BuGetInetsocketClick(Sender: TObject);
var
c: TInetSocket;
str : String;
begin
//catch ESocketError (seHostNotFound or seConnectFailed) if you care
Memo1.Append('--- GetIpAddrList (with TInetSocket)---');
try
c := TInetSocket.Create('192.168.1.1',80);
str := NetAddrToStr(c.LocalAddress.sin_addr);
finally
c.Free;
end;
Memo1.Append(str);
end;
procedure TForm1.BuGetIPListClick(Sender: TObject);
var
str : String;
begin
Memo1.Append('--- GetIpAddrList (with ifconfig)---');
str := GetIpAddrList;
Memo1.Append(str);
end;
procedure TForm1.BuGetIPSynaClick(Sender: TObject);
var
str : String;
begin
Memo1.Append('--- Synase GetLocalIPs ---');
str := GetLocalIPs;
Memo1.Append(str);
end;
end.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
Re: Synapse : Stretch : Eigene IP-Adresse ermitteln
das sollte aber überarbeitet werden, denn:
ifconfig is deprecated
z.B.: https://www.linux.com/learn/replacing-ifconfig-ip
ifconfig is deprecated
z.B.: https://www.linux.com/learn/replacing-ifconfig-ip
Gruß, Michael
- af0815
- Lazarusforum e. V.
- Beiträge: 6763
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Synapse : Stretch : Eigene IP-Adresse ermitteln
Das kann jeder der es will gerne machen. Die Lösungen mit TProzess haben für mich sowieso Prio -1. Das war nur eine punktuelle Zusammenfassung der Beiträge für mich. Deswegen auch nicht als fertige App.six1 hat geschrieben:das sollte aber überarbeitet werden, denn:
ifconfig is deprecated
z.B.: https://www.linux.com/learn/replacing-ifconfig-ip
Wäre schön wenn die neuen Tools eine API hätten, sprich es eine Lib gibt. Ist dazu was bekannt?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).