Synapse : Stretch : Eigene IP-Adresse ermitteln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Synapse : Stretch : Eigene IP-Adresse ermitteln

Beitragvon braspi » 13. Mär 2019, 20:36 Synapse : Stretch : Eigene IP-Adresse ermitteln

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;
braspi
 
Beiträge: 57
Registriert: 20. Mär 2016, 16:39

Beitragvon af0815 » 13. Mär 2019, 21:27 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).
af0815
 
Beiträge: 3629
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon six1 » 14. Mär 2019, 06:31 Re: Synapse : Stretch : Eigene IP-Adresse ermitteln

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;     
 
six1
 
Beiträge: 70
Registriert: 1. Jul 2010, 18:01

Beitragvon af0815 » 14. Mär 2019, 07:39 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.

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).
af0815
 
Beiträge: 3629
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon six1 » 14. Mär 2019, 07:45 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
six1
 
Beiträge: 70
Registriert: 1. Jul 2010, 18:01

Beitragvon af0815 » 14. Mär 2019, 19:52 Re: Synapse : Stretch : Eigene IP-Adresse ermitteln

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).
af0815
 
Beiträge: 3629
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried