⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 118.htm

📁 水木清华的BBS文章
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://bbs.tsinghua.edu.cn"><font face="黑体"><big><big>水木清华★</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">         Delphi编程                            (BM: strayli FlyingBoy)          </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="454"> <p align="center">[<a href="index.htm">回到开始</a>][<a href="4.htm">上一层</a>][<a href="119.htm">下一篇</a>]
<hr><p align="left"><small>发信人: strayli (stray), 信区: Delphi <br>

标  题: Delphi编程实现Ping操作 <br>

发信站: BBS 水木清华站 (Sat Oct 17 20:52:52 1998) WWW-POST <br>

  <br>

作    张泰立    使用过网络的用户都熟悉“Ping”这个指令,它是一个DOS下的可 <br>

执行文件,一般用 <br>

 它来检查网络连接的好坏程度。其基本原理是利用TCP/IP协议包中ICMP协议中的一个功 <br>

  <br>

 能,即向所指定的计算机发送一个请求,收到请求的计算机返回一个应答,借此来判断 <br>

该 <br>

 计算机是否在网上运行或者检查网络连接是否稳定可靠。在Ping程序执行过程中,双方 <br>

计算机所耗费的资源都很少,因此,它是一个非常实用的工具。 <br>

   我们可以通过编程来实现“Ping”操作,对其加以改进,使之具有Windows的界面 <br>

风格,显示比DOS更加直观。 <br>

   首先,对编程中需要的动态链接库作一简要说明:在Windows的System目录下,你 <br>

 可以找到Icmp.dll文件,该动态链接库提供了ICMP协议的所有功能,我们的编程就建立 <br>

在    对该动态链接库的调用上。 <br>

   Icmp.dll文件内的调用函数说明如下:    1、IcmpCreateFile    打开一个句 <br>

柄,通过该句柄你可以发送ICMP的请求回送报文。 <br>

   2、IcmpCloseHandle    关闭你通过IcmpCreateFile函数打开的句柄。    3、 <br>

IcmpSendEcho <br>

   通过你打开的句柄发送ICMP请求,在超时或应答报文接收后返回。其参数基本上和 <br>

  <br>

  <br>

 它的帧结构一致,可参看下面的程序部分,其具体含意你可以参看有关ICMP协议的书 籍 <br>

。    初步了解了上述的三个函数后,我们就可以开始编程了。 <br>

   首先,我们的程序运行后应该有如图1所示的基本功能。为此,我们可先在Delphi的 <br>

 窗口中放入右上图中所示的控件,如按钮、编辑框和文本显示框等。 <br>

   (G72.JPG)    例程运行示意图    然后,在程序的开始部分(FormCreate) <br>

对WinSocket进行初始化,其作用是申明 <br>

 使用的版本信息,同时调入Icmp.dll库。    type <br>

    PIPOptionInformation = ^TIPOptionInformation; <br>

    TIPOptionInformation = packed record     TTL: Byte;     TOS: Byte; <br>

  <br>

    Flags: Byte;     OptionsSize: Byte;     OptionsData: PChar;     <br>

end; <br>

    PIcmpEchoReply = ^TIcmpEchoReply;     TIcmpEchoReply = packed record <br>

  <br>

    Address: DWORD;     Status: DWORD;     RTT: DWORD;     DataSize: <br>

Word; <br>

    Reserved: Word;     Data: Pointer;     Options: TIPOptionInformation <br>

; <br>

    end;     TIcmpCreateFile = function: THandle; stdcall; <br>

    TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall; <br>

    TIcmpSendEcho = function(IcmpHandle:THandle;     DestinationAddress: <br>

DWORD; <br>

DWORD; <br>

    RequestData: Pointer;     RequestSize: Word; <br>

    RequestOptions: PIPOptionInformation;     ReplyBuffer: Pointer; <br>

    ReplySize: DWord;     Timeout: DWord     ): DWord; stdcall; <br>

    TMyPing = class(TForm)     Panel1: TPanel;     Label1: TLabel; <br>

    PingEdit: TEdit;     ExeBtn: TButton;     Button2: TButton; <br>

    Button3: TButton;     StatusShow: TMemo; <br>

    procedure Button3Click(Sender: TObject); <br>

    procedure FormCreate(Sender: TObject); <br>

    procedure ExeBtnClick(Sender: TObject);     private <br>

    { Private declarations }     hICMP: THANDLE; <br>

    IcmpCreateFile : TIcmpCreateFile;     IcmpCloseHandle: <br>

TIcmpCloseHandle; <br>

    IcmpSendEcho: TIcmpSendEcho;     public     { Public declarations } <br>

   end; <br>

   procedure TMyPing.FormCreate(Sender: TObject);    var     WSAData: <br>

TWSAData; <br>

    hICMPdll: HMODULE;    begin  ?    // Load the icmp.dll stuff <br>

    hICMPdll := LoadLibrary('icmp.dll'); <br>

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

    @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle'); <br>

    @IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho'); <br>

    hICMP := IcmpCreateFile;     StatusShow.Text := ''; <br>



    StatusShow.Lines.Add('目的IP地址 字节数 返回时间(毫秒)');    end; <br>

   接下来,就要进行如下所示的Ping操作的实际编程过程了。 <br>

   procedure TMyPing.ExeBtnClick(Sender: TObject);    var <br>

    IPOpt:TIPOptionInformation;// IP Options for packet to send <br>

    FIPAddress:DWORD;     pReqData,pRevData:PChar; <br>

    pIPE:PIcmpEchoReply;// ICMP Echo reply buffer     FSize: DWORD; <br>

    MyString:string;     FTimeOut:DWORD;     BufferSize:DWORD;     <br>

begin <br>

    if PingEdit.Text <> '' then     begin <br>

    FIPAddress := inet_addr(PChar(PingEdit.Text));     FSize := 40; <br>

    BufferSize := SizeOf(TICMPEchoReply) + FSize;     GetMem(pRevData,FSiz <br>

e); <br>

    GetMem(pIPE,BufferSize);     FillChar(pIPE^, SizeOf(pIPE^), 0); <br>

    pIPE^.Data := pRevData;     MyString := 'Hello,World'; <br>

    pReqData := PChar(MyString);     FillChar(IPOpt, Sizeof(IPOpt), 0); <br>

    IPOpt.TTL := 64;     FTimeOut := 4000; <br>

    IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString), <br>

 @IPOpt, pIPE, BufferSize, FTimeOut); <br>

    if pReqData^ = pIPE^.Options.OptionsData^ then     begin <br>

    StatusShow.Lines.Add(PChar(PingEdit.Text) + ' ' <br>

 +IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));     end; <br>

    FreeMem(pRevData);     FreeMem(pIPE);     end    end; <br>

FreeMem(pRevData);     FreeMem(pIPE);     end    end; <br>

   通过上面的编程,我们就实现了Ping功能的界面操作。实际上,ICMP协议的功能还 <br>

有很    多,都可以通过对Icmp.dll的函数调用来实现。 <br>

  <br>

-- <br>

※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.38.66.149] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="4.htm">上一层</a>][<a href="119.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -