Search code examples
delphidelphi-2010firewallstatusping

Show whether my application can connect to internet or blocked by Firewall?


In my application, i want to show the status of ( whether the connection is connected to internet ) by pinging to some ip address like google.com , and if there was responses, so the status is Online, and if not, i want to show the status Offline, and tell the user to configure his firewall.

How to ping using delphi, using for exemple a function to ping something like

  Ping(88.125.124.1);

a function which returns true if there are a connection or return false elsewhere.

Thank you


Solution

  • You must know that ping needs a timeOut. So you have a lot of solutions, my prefered is ICS openSource library with TPing

    Here is the demo code from François Piette :

    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.