📄 118.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 + -