Показать, может ли мое приложение подключаться к Интернету или заблокировано брандмауэром? - PullRequest
0 голосов
/ 27 декабря 2011

В моем приложении я хочу показать состояние (подключено ли подключение к Интернету), выполнив команду ping на некоторый IP-адрес, такой как google.com, и, если были ответы, значит, статус «Онлайн», и если нет, я хочу показать статус «Не в сети» и сказать пользователю настроить его брандмауэр.

Как пинговать с помощью delphi, используя для примера функцию ping что-то вроде

  Ping(88.125.124.1);

функция, которая возвращает true, если есть соединение, или возвращает false в другом месте.

Спасибо

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Вы должны знать, что для ping требуется timeOut. Так что у вас есть много решений, я предпочитаю библиотеку ICS openSource с TPing

Вот демонстрационный код от Франсуа Пиетта:

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.
0 голосов
/ 27 декабря 2011

Пинг использует ICMP .Это совершенно другой протокол, работающий по IP (он находится на одном уровне TCP и UDP, и множество других протоколов, которые используют IP).Он может быть заблокирован в любой момент (например, в моей компании некоторые маршрутизаторы не маршрутизируют ICMP по соображениям безопасности), и это не очень хороший показатель, если для вас «подключение к Интернету» означает, что HTTP работает.Вы должны попытаться получить HTTP-ответ от известного сайта.Вот как, например, Windows Vista / 7 проверяет, есть ли «доступ в Интернет», они используют определенный URL, предназначенный для этих задач.И в некоторых установках ping может работать, но HTTP не может, например, потому что есть прокси, требующий аутентификации.

...