Заметки · 29.12.2022

Ping в Synapse и рядом с ним

Ранее уже был пост об установке библиотеки Synapse в проект IDE Lazarus. Все посты, посвящённые этой среде разработки можно найти здесь.

В предыдущем посте, посвященном связке Lazarus+Synapse, я (в числе прочего) приводил пример простейшей пинговалки, но там она была процедурная. Сейчас хотелось бы представить примеры логических функций пинга. Только, разумеется, не стоит пинговать большое количество узлов в основном потоке программы.

Пинг узла с помощью библиотеки Synapse:

uses ..., pingsend;

function PingWithSynapse(hostname:string):Boolean;
var
  ping: TPingSend;
begin
  ping:=TPINGSend.Create;
  try
    ping.Timeout:=2000;
    if ping.Ping(hostname)=True then result:=True else result:=False;
  finally
    ping.Free;
  end;
end;   

Вызывается функция так:

if PingWithSynapse('ngdream.ru')=True then ShowMessage('Онлайн!') else ShowMessage('Оффлайн!');

Если с Synapse что-то идёт не так, можно попробовать проверить доступность удалённого узла с помощью процесса, обращённого к Powershell. Само собой, этот метод применим только в среде операционных систем Windows.

Функция пинга узла с помощью PowerShell командлета Test-Connection выглядит вот так:

uses ..., Process;

function PingWithPowerShell(hostname:string):Boolean;
var
  ping: string;
  pingrun: TProcess;
  output_ping: Tstringlist;
  answer: string;
begin
  try
    ping:='test-connection -Count 1 -computer '+hostname+' -quiet';
    pingrun:=TProcess.Create(nil);
    pingrun.Executable:='powershell.exe';
    pingrun.Parameters.Add(ping);
    pingrun.Options:=pingrun.Options+[poNoConsole, poUsePipes, poWaitOnExit];
    pingrun.Execute;
    output_ping:=TSTringList.Create;
    output_ping.LoadFromStream(pingrun.Output);
    answer:=Trim(output_ping.Text);
    pingrun.Free;
    output_ping.Free;
    if answer='False' then result:=False else result:=True;
   except
 end;
end;

Вызывается функция аналогично первой:

if PingWithPowerShell('ngdream.ru')=True then ShowMessage('Онлайн!') else ShowMessage('Оффлайн!');