显示我的应用程序是否可以连接到Internet或被防火墙阻止?

时间:2011-12-27 13:18:07

标签: delphi delphi-2010 firewall status ping

在我的应用程序中,我想通过ping到google.com等某个IP地址来显示(连接是否连接到互联网)的状态,如果有响应,那么状态为Online,如果没有,我想显示离线状态,并告诉用户配置他的防火墙。

如何使用delphi进行ping操作,例如使用函数来ping类似

  Ping(88.125.124.1);

一个函数,如果有连接则返回true或在其他地方返回false。

谢谢

2 个答案:

答案 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不能,例如因为需要身份验证的代理。