摘要本文主要介绍利用Delphi实现一个图形界面Ping程序的方法其中主要讨论了ICMP协议和ICMP协议控件及其编程方法并给出了一个实例程序解决了Ping命令行程序的缺点
关键词DelphiICMP协议Ping程序
操作系统Windows Server 中文版
编程工具Delphi
一 前言在日常网络管理时我们常用Ping命令来测试是否能与宿主(或路由)连通但它一般是以命令行的形式提供给我们不仅使用不方便而且命令执行速度较快时常常使我们看不清执行结果那么有没有办法来解决这个矛盾呢?答案当然是肯定的下面我们将利用Delphi强大的网络编程功能来实现一个图形化的Ping程序程序的运行界面如图所示
程序的主要功能在Address后的编辑框中可以输入一个计算机的名称或者IP地址然后按Ping按钮或直接按回车可以测试与宿主计算机的连通性如果连能正常则在下面的列表框中显示宿主计算机的IP地址等信息可以通过Clear功能按钮实现对列表框信息的清除
二 编程原理
ICMP(Internet Control Messages Protocol)是Internet信报控制协议的简写它将报文放在一个IP数据报的数据部分中通过网络传送该协议允许路由器向其它的路由器或者主机发送并且回收差错与控制报文它为发生差错的路由器提供了向源端报告差错的功能连通性测试程序Ping正是利用了ICMP协议的这种特性通过向目的端(宿主)发送并且回收信报来测试端到端的连通性
Delphi新增了Indy网络控件组包括了几乎所有的网络协议控件比如SMTPPOPSNMP及ICMP等避免了程序员直接与WinSocket打交道大大方便了我们编写网络程序Indy控件组分为Server和Clent两部分以适应我们编写不同的服务器/工作站程序我们可以很方便的在Indy Clent中找到ICMP协议控件TidIcmpClient
TidIcmpClient控件的常用属性如下
HOST宿主计算机的IP地址可以是计算机的名字或者IP地址
Port表示接收报文的本地系统的端口号
ReceiveTimeout表示连接等待宿主计算机回应的最大时间单位是毫秒
TidIcmpClient控件的主要方法
Ping()检测本地计算机与宿主计算机的连通性
TidIcmpClient控件的主要事件
OnICMPReply(ASender: TComponent; const AReplyStatus: TReplyStatus)在本地计算机接收到宿主计算机回应时触发回收消息放在对象AreplyStatus中
三编程实现
下面我们就来制作一个图形界面的Ping程序
启动Delphi打开一个新的标准工程在窗体中添加所需的控件
首先向窗体顶端添加一个Panel控件在其上再依次添加一个LabelEdit和两个Button控件并修改Button控件的标题为Ping和Clear然后再在Panel下面添加一个ListBox控件最后再添加一个ICMP控件并修改其名字属性为ICMP依次设置其他有关的属性等
Edit控件是实现IP地址或者计算机名字的输入的 Button则是实现Ping功能的将其Default属性设为True这样当用户按下回车键时可以直接实现Ping功能其主要的代码段如下
procedure TFormButtonClick(Sender: TObject);
var
i : integer;
begin
ICMPHost := EditText ; //宿主计算机的名称或IP地址
ICMPReceiveTimeout := ; //最大等待时间
ButtonEnabled := false;
try
for i:= to do //重复次
begin
ICMPPing ;
ApplicationProcessMessages ; //延时
end;
finally
ButtonEnabled := true;
end;
end;
当本地计算机向宿主计算机发送一个数据包当本地计算机接收到宿主计算机的信息时会触发ICMPReply事件可以在这个事件中实现对回收信息的显示或者差错等其主要的代码段如下
procedure TFormICMPReply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
var
sTime: string;
begin
//检测Ping的回复错误
if (AReplyStatusMsRoundTripTime = ) then
sTime := <
else
sTime := =;
//在列表框中显示Ping消息
ListBoxItemsAdd(Format(ICMP_SEQ=%d Reply from %s [%s] : Bytes=%d time%s%d ms TTL=%d
[AReplyStatusSequenceId
EditText
AReplyStatusFromIpAddress
AReplyStatusBytesReceived
sTime
AReplyStatusMsRoundTripTime
AReplyStatusTimeToLive]));
end;
Button按钮是实现对列表框的清除功能的代码段如下
procedure TFormButtonClick(Sender: TObject);
begin
ListBoxClear ;
end;
编译上面的程序一个图形化的Ping程序就这样轻轻松松的展现在您的面前了是不是很酷?实际上我们还可以通过Delphi提供的Indy控件组实现其它的网络程序自己做一下你会发现你在做这些时其实很简单因为Delphi已经为程序员做了许多工作好了大家如果有什么问题欢迎发信到romanticonline@hotmailcom大家共同进步吧
程序在Windows中文版Delphi下编译通过