在我的应用程序中,我想通过ping到google.com等某个IP地址来显示(连接是否连接到互联网)的状态,如果有响应,那么状态为Online,如果没有,我想显示离线状态,并告诉用户配置他的防火墙。
如何使用delphi进行ping操作,例如使用函数来ping类似
Ping(88.125.124.1);
一个函数,如果有连接则返回true或在其他地方返回false。
谢谢
答案 0 :(得分:1)
您必须知道ping需要timeOut。所以你有很多解决方案,我首选的是带有TPing
的ICS openSource库以下是FrançoisPiette的演示代码:
unit OverbyteIcsPingTst1;
{$I OverbyteIcsDefs.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Forms, StdCtrls, Controls,
OverbyteIcsWndControl, OverbyteIcsPing;
const
PingTestVersion = 600;
CopyRight : String = ' PingTest (c) 1997-2007 Francois Piette V6.00 ';
type
TPingTstForm = class(TForm)
Ping1: TPing;
Label1: TLabel;
HostEdit: TEdit;
PingButton: TButton;
DisplayMemo: TMemo;
CancelButton: TButton;
procedure PingButtonClick(Sender: TObject);
procedure Ping1Display(Sender: TObject; Icmp: TObject; Msg: String);
procedure Ping1DnsLookupDone(Sender: TObject; Error: Word);
procedure CancelButtonClick(Sender: TObject);
procedure Ping1EchoRequest(Sender: TObject; Icmp: TObject);
procedure Ping1EchoReply(Sender: TObject; Icmp: TObject; Status: Integer);
end;
var
PingTstForm: TPingTstForm;
implementation
{$R *.DFM}
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPingTstForm.PingButtonClick(Sender: TObject);
begin
DisplayMemo.Clear;
DisplayMemo.Lines.Add('Resolving host ''' + HostEdit.Text + '''');
PingButton.Enabled := FALSE;
CancelButton.Enabled := TRUE;
Ping1.DnsLookup(HostEdit.Text);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPingTstForm.Ping1DnsLookupDone(Sender: TObject; Error: Word);
begin
CancelButton.Enabled := FALSE;
PingButton.Enabled := TRUE;
if Error <> 0 then begin
DisplayMemo.Lines.Add('Unknown Host ''' + HostEdit.Text + '''');
Exit;
end;
DisplayMemo.Lines.Add('Host ''' + HostEdit.Text + ''' is ' + Ping1.DnsResult);
Ping1.Address := Ping1.DnsResult;
Ping1.Ping;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPingTstForm.Ping1Display(Sender: TObject; Icmp: TObject; Msg: String);
begin
DisplayMemo.Lines.Add(Msg);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPingTstForm.CancelButtonClick(Sender: TObject);
begin
Ping1.CancelDnsLookup;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPingTstForm.Ping1EchoRequest(Sender: TObject; Icmp: TObject);
begin
DisplayMemo.Lines.Add('Sending ' + IntToStr(Ping1.Size) + ' bytes to ' +
Ping1.HostName + ' (' + Ping1.HostIP + ')');
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TPingTstForm.Ping1EchoReply(
Sender : TObject;
Icmp : TObject;
Status : Integer);
begin
if Status <> 0 then
{ Success }
DisplayMemo.Lines.Add('Received ' + IntToStr(Ping1.Reply.DataSize) +
' bytes from ' + Ping1.HostIP +
' in ' + IntToStr(Ping1.Reply.RTT) + ' msecs')
else
{ Failure }
DisplayMemo.Lines.Add('Cannot ping host (' + Ping1.HostIP + ') : ' +
Ping1.ErrorString +
'. Status = ' + IntToStr(Ping1.Reply.Status));
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
end.
答案 1 :(得分:0)
Ping使用ICMP。这是一个完全不同的协议在IP上运行(它在TCP和UDP的同一层,以及一堆使用IP的其他协议)。它可以在任何一跳被阻止(例如,在我的公司,一些路由器出于安全原因没有路由ICMP),如果“连接到Internet”意味着HTTP工作,它不是一个好的指标。您应该尝试从已知站点获取HTTP答案。这就是例如Windows Vista / 7检查是否存在“互联网访问”,他们使用专用于该任务的特定URL。在某些设置中ping可能有效,但HTTP不能,例如因为需要身份验证的代理。