DelphiはICMPを使用して、リモートホストが生きているかどうかを検出します
2005-03-10 Jlbnet
ネットワーク通信では、次の部分で実行される操作を決定するためにリモートホストが生きているかどうかを判断することがしばしば必要です。 ICMPプロトコルを使用して直接実装できますが、多くのプロトコルの詳細を考慮する必要があります。これは、実装するのがより面倒です。 ICMPライブラリには、Windowsに付属する既製の機能があり、使用前に対応するデータ構造に登録するだけです。
以下は、使用するデータ構造です。这些结构MSDN里有C形式的声明,这里给出的是Delphi的形式。
//用到的协议数据结构
PipOptionInfo = ^TIPOptionInfo; // IP 头选项
tipoptionInfo =パックされたレコード
TTL:byte; //寿命
TOS:byte; //サービスのタイプ、リクエストタイプ
フラグ:byte; //宝くじ
OptionsSize: Byte;//选项长度
optionsdata:pchar; //オプションデータ
終わり;
picmpechoreply = ^ticmpechoreply;
ticmpechoreply = packed record // ICMP返品情報
アドレス:DWORD; // IPアドレス
ステータス:DWORD; //ステータス
RTT:DWORD;
Datasize:word; //データの長さ
予約済み:Word; //予約
データ:Pointer; //データ
オプション:TipoptionInfo; //オプションエリア
終わり;
//動的ライブラリの関数宣言
ticmpcreatefile = function:thandle;
ticmpclosehandle = function(icmphandle:thandle):stdcall;
ticmpsendecho = function(icmphandle:thandle; destivingAddress:dword;
requestdata:pointer:word:pipoptioninfo;
ReplyBuffer:repintsize:dword:dword; // icmpプローブデータグラムを送信します
//使用する変数宣言
hicmpdll、hicmp:thandle;
wsadata:twsadata;
ICMPCreateFile:ticmpcreatefile;
icmpclosehandle:ticmpclosehandle;
ICMPSENDECHO:ticmpsendecho;
// Destip:検出されるリモートアドレスは192.168.1.1です
手順f_checkonline(destip:string);
var
IPOPT:TipoptionInfo; //パッケージIPオプション
iPaddr:dword;
preqdata、prevdata:pchar;
パイプ:picmpechoreply; // ICMPエコー応答バッファー
fsize:dword;
MyString:文字列;
ftimeout:dword;
BufferSize:DWORD;
I:整数;
始める
hicmpdll:= loadlibrary( 'icmp.dll'); // ICMPダイナミックライブラリをクリックします
hicmpdll <> nullの場合
始める
wsastartup($ 101、wsadata); //ネットワークプロトコルスタックの初期化
@icmpcreatefile:= getProcAddress(hicmpdll、 'icmpcreatefile'); //ダイナミックライブラリのエクスポート機能をお願いします
@icmpclosehandle:= getProcAddress(hicmpdll、 'icmpclosehandle');
@ICMPSENDECHO:= getProcAddress(hicmpdll、 'icmpsendecho');
HICMP:= ICMPCreateFile; // ICMPハンドルを作成します
iPaddr:= inet_addr(pchar(destip)); //リモートホストのIPアドレスを検出してください
fsize:= 40;
緩衝液:= sizeof(ticmpechoreply) + fsize;
getMem(prevdata、fsize);
getMem(パイプ、緩衝型);
fillchar(pipe^、sizeof(pipe^)、0);
pipe^.data:= prevdata;
myString:= 'こんにちは、オンライン?'; //任意の文字列
preqdata:= pchar(mystring);
fillchar(ipopt、sizeof(ipopt)、0);
ipopt.ttl:= 64;
ftimeout:= 500; //待機時間
i:= ICMPSENDECHO(HICMP、iPaddr、preqdata、length(mystring)、@ipopt、pipe、buffersize、ftimeout); //戻り値がある場合、返品値は受信した返信数を示します。 0が返信がない場合、ホストは到達できません
Freemem(prevdata);
Freemem(パイプ);
icmpclosehandle(hicmp);
Freelibrary(hicmpdll); //ダイナミックライブラリをリリースします
wsacleanup(); //プロトコルスタックをクリーニングします
終わり;
終わり;