Synapse : Stretch : Eigene IP-Adresse ermitteln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
braspi
Beiträge: 57
Registriert: So 20. Mär 2016, 16:39

Synapse : Stretch : Eigene IP-Adresse ermitteln

Beitrag von braspi »

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[i]);
if n=0 then Continue;
s := sl[i];
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;

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4105
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Synapse : Stretch : Eigene IP-Adresse ermitteln

Beitrag von af0815 »

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).

Benutzeravatar
six1
Beiträge: 161
Registriert: Do 1. Jul 2010, 19:01

Re: Synapse : Stretch : Eigene IP-Adresse ermitteln

Beitrag von six1 »

Hi,
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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4105
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Synapse : Stretch : Eigene IP-Adresse ermitteln

Beitrag von af0815 »

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.

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).

Benutzeravatar
six1
Beiträge: 161
Registriert: Do 1. Jul 2010, 19:01

Re: Synapse : Stretch : Eigene IP-Adresse ermitteln

Beitrag von six1 »

das sollte aber überarbeitet werden, denn:
ifconfig is deprecated

z.B.: https://www.linux.com/learn/replacing-ifconfig-ip
Gruß, Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4105
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Synapse : Stretch : Eigene IP-Adresse ermitteln

Beitrag von af0815 »

six1 hat geschrieben:das sollte aber überarbeitet werden, denn:
ifconfig is deprecated

z.B.: https://www.linux.com/learn/replacing-ifconfig-ip

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.

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).

Antworten