Пинг нескольких серверов и выбрать ip того кто первый откликнулся
PHP код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, OverbyteIcsWndControl, OverbyteIcsPing,
Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls;
const IP='192.168.0.1';
type
TForm1 = class(TForm)
DisplayMemo: TMemo;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure ondd(sender:TObject);
procedure ondd2(sender:TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TPingThread = class(TThread)
private
FHost: string;
FResponseHost : string;
FPing: TPing;
procedure PingEchoReply(Sender, Icmp: TObject; Status: Integer);
protected
procedure Execute; override;
procedure SendPing;
public
property LogSeverIP : string read FResponseHost;
constructor Create(pHost:string);
end;
var
Form1: TForm1;
ping1:TPingThread;
ping2:TPingThread;
server:string;
implementation
{$R *.dfm}
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ping1:=TPingThread.Create(ip);
ping2:=TPingThread.Create('20.85.229.104');
ping1.OnTerminate:=ondd;
ping2.OnTerminate:=ondd2;
ping1.Resume;
ping2.Resume;
repeat
ping1.WaitFor;
ping2.WaitFor;
if server.Length <> 0 then
Break
until server.Length <> 0
//дальше коннект и отправка в зависимости от адреса
end;
procedure TForm1.ondd(sender: TObject);
begin
DisplayMemo.Lines.Add('--------begin1----------');
if Ping1.FResponseHost.Length <> 0 then
begin
server := Ping1.FResponseHost;
DisplayMemo.Lines.Add('--SERVER-IS-: '+server);
end;
DisplayMemo.Lines.Add('----------End1-----------');
end;
procedure TForm1.ondd2(sender: TObject);
begin
DisplayMemo.Lines.Add('--------begin2----------');
if Ping2.FResponseHost.Length <> 0 then
begin
server := Ping2.FResponseHost;
DisplayMemo.Lines.Add('--SERVER-IS-: '+server);
end;
DisplayMemo.Lines.Add('----------End2-----------');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
try
ping1:=TPingThread.Create(ip);
ping2:=TPingThread.Create('29.85.229.104');
ping1.OnTerminate:=ondd;
ping2.OnTerminate:=ondd2;
finally
end;
end;
{ TPingThread }
constructor TPingThread.Create(pHost: string);
begin
inherited Create(True);
FHost:= pHost;
end;
procedure TPingThread.Execute;
begin
SendPing;
end;
procedure TPingThread.PingEchoReply(Sender, Icmp: TObject; Status: Integer);
begin
if Status=0 then
FResponseHost := ''
else
FResponseHost := FHost;
end;
procedure TPingThread.SendPing;
var
FPing:TPing;
begin
Fping:=Tping.Create(nil);
try
FPing.Address:=FHost;
FPing.OnEchoReply:=PingEchoReply;
FPing.Timeout := 50;
FPing.Ping;
finally
FPing.Free;
end;
end;
end.
server иногда вообще ничего не возвращает