2011-12-27 4 views
0

、私は、私はgoogle.comのようないくつかのIPアドレスにpingして(接続がインターネットに接続されているかどうか)の状態を表示したい、と応答があった場合、そのステータスはオンラインで、そうでない場合オフライン状態を表示し、ユーザーにファイアウォールの設定を指示します。 私のアプリケーションがインターネットに接続できるのか、ファイアウォールでブロックされているのかを表示しますか?私のアプリケーションで

はどのように

Ping(88.125.124.1); 

が接続されているか、他の場所でfalseを返す場合はtrueを返す関数のようなものをpingするexemple機能のために使用して、デルファイを使用してpingを実行します。

あなたはpingがタイムアウトを必要としていることを知っている必要がありますあなたの

+0

代わりのpingを実行 - ターゲットホスト上で無効にすることができます - 私は、例えば、HTTPのために、特定のサービス/ポートにアクセスしようとするだろう。 – mjn

答えて

1

ありがとうございます。だから、あなたはソリューションの多くを持って、私れる好ましいここTPing

とICSオープンソースのライブラリであるフランソワ・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. 
+0

または、ICSを使用しない場合は、Serhiy Perevoznykが提案したソリューションを確認してください。http://delphi.about.com/od/internetintranet/l/aa081503a.htm – Pateman

0

PingがICMPを使用しています。これは、IP上で実行されている全く異なるプロトコルです(TCPとUDPの同じレイヤー、およびIPを使用する他のプロトコルの束)。どのホップでもブロックすることができます(たとえば、私の会社ではセキュリティ上の理由から一部のルータがICMPをルーティングしません)。インターネットに接続されているとHTTPが動作することを意味します。既知のサイトからHTTP回答を取得するようにしてください。これは、例えばWindows Vista/7が「インターネットアクセス」があるかどうかをチェックする方法です。それらは、そのタスクに専用の特定のURLを使用します。また、いくつかの設定ではpingが動作するかもしれませんが、例えば認証を必要とするプロキシがあるためHTTPはできません。

関連する問題