Ранее уже был пост об установке библиотеки 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('Оффлайн!');