2016年12月30日

ping

お久しぶりです。

久しぶりにdelphiを使った。

Embarcadero® RAD Studio 10.1 Berlin バージョン 24.0.25048.9432 

無料版である。

pingを実行したかった。

ExPingというフリーソフトがあるが、あれに機能を加えたいと思っている。

いきなりソースを貼る。
-----
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
  IdComponent, IdRawBase, IdRawClient, IdIcmpClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdIcmpClient1: TIdIcmpClient;
    Edit1: TEdit;
    Memo1: TMemo;
    Edit2: TEdit;
    Label1: TLabel;
    Edit3: TEdit;
    Label2: TLabel;
    Edit4: TEdit;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function DoPing (Host: String; TimeOut: Integer) : String;
begin
//  ShowMessage('hello');
  TIdIcmpClient.Create();
  Form1.IdIcmpClient1 := TIdIcmpClient.Create(nil);
  Form1.IdIcmpClient1.ReceiveTimeout := TimeOut;

  Form1.IdICMPClient1.Host:= Host;
  Form1.IdICMPClient1.Ping();

  if (Form1.IdIcmpClient1.ReplyStatus.ReplyStatusType = rsTimeout) then
    begin
      Result :='Timeout'
    end
  else
    if(Form1.IdIcmpClient1.ReplyStatus.ReplyStatusType = rsEcho) then
      begin
        Result :=
                  Form1.IdIcmpClient1.ReplyStatus.FromIpAddress
                + ' -> '
                + Form1.IdIcmpClient1.ReplyStatus.ToIpAddress
                + '  '
                + IntToStr(Form1.IdIcmpClient1.ReplyStatus.BytesReceived)
                + ' Bytes received: '
                + ' TTL: '
                + IntToStr(Form1.IdIcmpClient1.ReplyStatus.TimeToLive)
                + ' time: ' + IntToStr(Form1.IdIcmpClient1.ReplyStatus.MsRoundTripTime)
    end;
  Form1.IdIcmpClient1.Free;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  Num: Integer;
  TimeOut: Integer;
  Interval:Integer;
  i:integer;
begin
  Num := StrToIntDef(Edit2.Text, 3);
  TimeOut := StrToIntDef(Edit3.Text, 1000);
  Interval := StrToIntDef(Edit4.Text, 1000);

  for i:=1 to Num do begin
    Memo1.Lines.Add(DoPing(Edit1.Text, TimeOut));
    Sleep(Interval);
  end;

end;

end.
-----


無題.png

これはまだ基本機能しかない。

ちなみにF9を押すとアプリは起動するが実行するとエラーになる。
実行ファイルを「管理者として実行」しないとダメだ。
実行ファイルはプロジェクトが保存されているフォルダ配下の Win32\Debug にある。


これからやること。

・回数に0を指定したら停止ボタンを押すまで実行し続ける。
・timeout以外のエラーの対応
・統計情報の表示
・実行結果と統計情報の自動保存機能
・複数宛先を指定した場合順番にでなく並列に実施し、宛先ごとに結果と統計を保存する。つまりマルチスレッドにする
・名前解決に失敗すると例外になるのでその対応



ラベル:INDY
posted by delsoli at 07:39| Comment(0) | delphi | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。