国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

Delphi編程實現Ping操作

2019-11-18 19:00:45
字體:
來源:轉載
供稿:網友
Delphi編程實現Ping操作
  張泰立

  使用過網絡的用戶都熟悉“Ping”這個指令,它是一個DOS下的可執行文件,一般用它來檢查網絡連接的好壞程度。其基本原理是利用TCP/ip協議包中ICMP協議中的一個功能,即向所指定的計算機發送一個請求,收到請求的計算機返回一個應答,借此來判斷該計算機是否在網上運行或者檢查網絡連接是否穩定可靠。在Ping程序執行過程中,雙方計算機所耗費的資源都很少,因此,它是一個非常實用的工具。

  我們可以通過編程來實現“Ping”操作,對其加以改進,使之具有Windows的界面風格,顯示比DOS更加直觀。

  首先,對編程中需要的動態鏈接庫作一簡要說明:在Windows的System目錄下,你可以找到Icmp.dll文件,該動態鏈接庫提供了ICMP協議的所有功能,我們的編程就建立在對該動態鏈接庫的調用上。

  Icmp.dll文件內的調用函數說明如下:

  1、IcmpCreateFile

  打開一個句柄,通過該句柄你可以發送ICMP的請求回送報文。

  2、IcmpCloseHandle

  關閉你通過IcmpCreateFile函數打開的句柄。

  3、IcmpSendEcho

  通過你打開的句柄發送ICMP請求,在超時或應答報文接收后返回。其參數基本上和它的幀結構一致,可參看下面的程序部分,其具體含意你可以參看有關ICMP協議的書籍。

  初步了解了上述的三個函數后,我們就可以開始編程了。

  首先,我們的程序運行后應該有如圖1所示的基本功能。為此,我們可先在Delphi的窗口中放入右上圖中所示的控件,如按鈕、編輯框和文本顯示框等。

  (G72.JPG)

  例程運行示意圖

  然后,在程序的開始部分(FormCreate)對WinSocket進行初始化,其作用是申明使用的版本信息,同時調入Icmp.dll庫。

  type

   PIPOptionInformation = ^TIPOptionInformation;

   TIPOptionInformation = packed record

   TTL: Byte;

   TOS: Byte;

   Flags: Byte;

   OptionsSize: Byte;

   OptionsData: PChar;

   end;

   PIcmpEchoReply = ^TIcmpEchoReply;

   TIcmpEchoReply = packed record

   Address: DWord;

   Status: DWORD;

   RTT: DWORD;

   DataSize: Word;

   Reserved: Word;

   Data: Pointer;

   Options: TIPOptionInformation;

   end;

   TIcmpCreateFile = function: THandle; stdcall;

   TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;

   TIcmpSendEcho = function(IcmpHandle:THandle;

   DestinationAddress: DWORD;

   RequestData: Pointer;

   RequestSize: Word;

   RequestOptions: PIPOptionInformation;

   ReplyBuffer: Pointer;

   ReplySize: DWord;

   Timeout: DWord

   ): DWord; stdcall;

   TMyPing = class(TForm)

   Panel1: TPanel;

   Label1: TLabel;

   PingEdit: TEdit;

   ExeBtn: TButton;

   Button2: TButton;

   Button3: TButton;

   StatusShow: TMemo;

   PRocedure Button3Click(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure ExeBtnClick(Sender: TObject);

   private

   { Private declarations }

   hICMP: THANDLE;

   IcmpCreateFile : TIcmpCreateFile;

   IcmpCloseHandle: TIcmpCloseHandle;

   IcmpSendEcho: TIcmpSendEcho;

   public

   { Public declarations }

  end;

  procedure TMyPing.FormCreate(Sender: TObject);

  var

   WSAData: TWSAData;

   hICMPdll: HMODULE;

  begin

   WSAStartup($101, WSAData);

   // Load the icmp.dll stuff

   hICMPdll := LoadLibrary('icmp.dll');

   @ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');

   @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');

   @IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');

   hICMP := IcmpCreateFile;

   StatusShow.Text := ';

   StatusShow.Lines.Add('目的IP地址 字節數 返回時間(毫秒)');

  end;

  接下來,就要進行如下所示的Ping操作的實際編程過程了。

  procedure TMyPing.ExeBtnClick(Sender: TObject);

  var

   IPOpt:TIPOptionInformation;// IP Options for packet to send

   FIPAddress:DWORD;

   pReqData,pRevData:PChar;

   pIPE:PIcmpEchoReply;// ICMP Echo reply buffer

   FSize: DWORD;

   MyString:string;

   FTimeOut:DWORD;

   BufferSize:DWORD;

  begin

   if PingEdit.Text <> ' then

   begin

   FIPAddress := inet_addr(PChar(PingEdit.Text));

   FSize := 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

   begin

   StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));

   end;

   FreeMem(pRevData);

   FreeMem(pIPE);

   end

  end;

  通過上面的編程,我們就實現了Ping功能的界面操作。實際上,ICMP協議的功能還有很多,都可以通過對Icmp.dll的函數調用來實現。

上一篇:通用Delphi數據庫輸入控件DBPanel的實現

下一篇:用Delphi實現遠程屏幕抓取

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 庄河市| 双鸭山市| 天全县| 凌源市| 开化县| 汾西县| 台安县| 逊克县| 鄄城县| 修武县| 濮阳市| 太湖县| 上虞市| 合肥市| 乌拉特后旗| 翁牛特旗| 垦利县| 黄浦区| 岐山县| 增城市| 建昌县| 桂阳县| 鹤岗市| 仁怀市| 涡阳县| 江口县| 仲巴县| 三门峡市| 武邑县| 灌南县| 南召县| 四川省| 小金县| 天气| 苏尼特左旗| 桂平市| 庆元县| 奇台县| 庆安县| 开平市| 苗栗市|