Ping 操作を実装するための Delphi プログラミング
張泰麗
インターネットを使用したことのあるユーザーは「Ping」コマンドをよく知っています。これは、DOS での実行可能ファイルであり、一般にネットワーク接続の品質を確認するために使用されます。基本原理は、TCP/ip プロトコル パッケージの ICMP プロトコルの関数を使用することです。つまり、指定されたコンピュータにリクエストを送信し、リクエストを受信したコンピュータは応答を返して、コンピュータが実行されているかどうかを判断します。インターネットまたはネットワークの接続が安定していて信頼できるかどうかを確認します。 Ping プログラムの実行中、両方のコンピューターが消費するリソースはほとんどないため、非常に実用的なツールです。
「Ping」の操作をプログラミングで実装し、Windows のインターフェーススタイルや DOS よりも直感的な表示に改良することができます。
まず、プログラミングに必要なダイナミック リンク ライブラリについて簡単に説明します。 Windows のシステム ディレクトリには、Icmp.dll ファイルがあります。このダイナミック リンク ライブラリは、ICMP プロトコルのすべての機能を提供します。ダイナミックリンクライブラリの呼び出し。
Icmp.dll ファイル内の呼び出し関数は次のように説明されています。
1.IcmpCreateFile
ICMP 要求エコー メッセージを送信できるハンドルを開きます。
2.IcmpCloseHandle
IcmpCreateFile 関数を通じて開いたハンドルを閉じます。
3.IcmpSendEcho
開いたハンドルを介して ICMP リクエストを送信し、タイムアウトまたは応答メッセージの受信後に戻ります。そのパラメータは基本的にそのフレーム構造と一致しています。その具体的な意味については、ICMP プロトコルに関する書籍を参照してください。
上記の 3 つの機能を事前に理解した後、プログラミングを開始できます。
まず、プログラムは実行後に図 1 に示す基本機能を備えている必要があります。これを行うには、まず、右上の図に示されているボタン、編集ボックス、テキスト表示ボックスなどのコントロールを Delphi ウィンドウに配置します。
(G72.JPG)
日常動作の模式図
次に、WinSocket はプログラム (FormCreate) の先頭で初期化され、使用されるバージョン情報を宣言し、同時に Icmp.dll ライブラリを呼び出します。
タイプ
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = パックされたレコード
TTL: バイト。
TOS: バイト。
フラグ: バイト。
オプションサイズ: バイト;
オプションデータ: PChar;
終わり;
PIcmpEchoReply = ^TIcmpEchoReply;
TICmpEchoReply = パックされたレコード
アドレス: DWord;
ステータス: DWORD;
RTT: DWORD;
データサイズ: ワード;
予約済み: 単語;
データ: ポインタ。
オプション: TIPOptionInformation;
終わり;
TICmpCreateFile = 関数: THandle;
TICmpCloseHandle = 関数(IcmpHandle: THandle): ブール値;
TicmpSendEcho = function(IcmpHandle:THandle;
宛先アドレス: DWORD;
RequestData: ポインタ。
リクエストサイズ: ワード;
RequestOptions: PIPOptionInformation;
ReplyBuffer: ポインタ。
返信サイズ: DWord;
タイムアウト: DWord
): DWord;
TMyPing = クラス(TForm)
パネル1: Tパネル;
ラベル 1: T ラベル;
PingEdit: TEdit;
ExeBtn: Tボタン;
ボタン 2: T ボタン;
ボタン 3: T ボタン;
ステータス表示: TMemo;
手順 Button3Click(送信者: TObject);
プロシージャ FormCreate(Sender: TObject);
プロシージャ ExeBtnClick(送信者: TObject);
プライベート
{プライベート宣言}
hICMP: ハンドル。
IcmpCreateFile: TicmpCreateFile;
IcmpCloseHandle: TicmpCloseHandle;
IcmpSendEcho: TicmpSendEcho;
公共
{公的宣言}
終わり;
プロシージャ TMyPing.FormCreate(送信者: TObject);
変数
WSAデータ: TWSAデータ;
hICMPdll: Hモジュール;
始める
WSAStartup($101, WSAData);
// icmp.dll のものをロードします
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
StatusShow.Text := ';
StatusShow.Lines.Add('宛先 IP アドレスのバイト数の戻り時間 (ミリ秒)');
終わり;
次に、以下に示すように、Ping 操作の実際のプログラミング プロセスを実行します。
プロシージャ TMyPing.ExeBtnClick(送信者: TObject);
変数
IPOpt:TIPOptionInformation;//送信するパケットの IP オプション
FIPA アドレス:DWORD;
pReqData、pRevData:PChar;
pIPE:PIcmpEchoReply;//ICMP エコー応答バッファ
Fサイズ: DWORD;
MyString:文字列;
FTimeOut:DWORD;
バッファサイズ:DWORD;
始める
if PingEdit.Text <> ' then
始める
FIPAddress := inet_addr(PChar(PingEdit.Text));
Fサイズ:= 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'Hello,World';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);
if pReqData^ = pIPE^.Options.OptionsData^ then
始める
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
終わり;
FreeMem(pRevData);
FreeMem(pIPE);
終わり
終わり;
以上のプログラミングにより、Ping機能のインターフェース動作を実装しました。実際、ICMP プロトコルには多くの機能があり、Icmp.dll への関数呼び出しを通じて実現できます。