<BODY>
<P ALIGN="center"><A HREF="http://home.donews.com/cgi-bin/article.fcgi?sw=77&articleid=23075"><FONT SIZE="4"><B>編程動動手,Ping程序“跟你走”![原創]</B></FONT></A><FONT COLOR="#333333" FACE="宋體"><BR>
---用Delphi打造圖形界面的Ping程序[原創]
<P ALIGN="right">★ 中共河南省濟源市委黨校,耿百強<BR>
<BR>
摘要:本文主要介紹利用Delphi6實現一個圖形界面Ping程序的方法,其中主要討論了ICMP協議和ICMP協議控件及其編程方法,並給出了一個實例程序。解決了Ping命令行程序的缺點。<BR>
關鍵詞:Delphi,ICMP協議,Ping程序</P>
<P>一、 前言<BR>
在日常網絡管理時,我們常用Ping命令來測試是否能與宿主(或路由)連通。但它一般是以命令行的形式提供給我們,不僅使用不方便,而且命令執行速度較快時,常常使我們看不清執行結果。那麼,有沒有辦法來解決這個矛盾呢?答案當然是肯定的。下面,我們將利用Delphi強大的網絡編程功能來實現一個圖形化的Ping程序,程序的運行界面如圖1所示。<BR>
<BR>
<IMG BORDER="0" SRC="http://www.bkjia.com/uploads/allimg/131209/16035a600-0.gif" WIDTH="16" HEIGHT="16">此主題相關圖片如下:<BR>
<A HREF="http://www.bkjia.com/uploads/allimg/131209/16035a431-1.jpg" TARGET="_blank"><IMG ALT="按此在新窗口浏覽圖片" BORDER="0" ONLOAD="javascript:if(this.width>screen.width-333)this.width=screen.width-333" SRC="http://www.bkjia.com/uploads/allimg/131209/16035a431-1.jpg" WIDTH="467"></A><BR>
程序的主要功能:在Address後的編輯框中可以輸入一個計算機的名稱或者IP地址,然後按Ping按鈕或直接按回車可以測試與宿主計算機的連通性,如果連能正常,則在下面的列表框中顯示宿主計算機的IP地址等信息。可以通過Clear功能按鈕實現對列表框信息的清除。<BR>
二、 編程原理<BR>
ICMP(Internet Control Messages Protocol)是Internet信報控制協議的簡寫,它將報文放在一個IP數據報的數據部分中通過網絡傳送,該協議允許路由器向其它的路由器或者主機發送並且回收差錯與控制報文,它為發生差錯的路由器提供了向源端報告差錯的功能。連通性測試程序Ping正是利用了ICMP協議的這種特性,通過向目的端(宿主)發送並且回收信報來測試端到端的連通性。<BR>
Delphi6.0新增了Indy網絡控件組,包括了幾乎所有的網絡協議控件,比如SMTP、POP3、SNMP及ICMP等,避免了程序員直接與WinSocket打交道,大大方便了我們編寫網絡程序。Indy控件組分為Server和Clent兩部分,以適應我們編寫不同的服務器/工作站程序。我們可以很方便的在Indy Clent中找到ICMP協議控件TidIcmpClient。<BR>
TidIcmpClient控件的常用屬性如下:<BR>
HOST:宿主計算機的IP地址,可以是計算機的名字或者IP地址;<BR>
Port:表示接收報文的本地系統的端口號;<BR>
ReceiveTimeout:表示連接等待宿主計算機回應的最大時間,單位是毫秒。<BR>
TidIcmpClient控件的主要方法:<BR>
Ping():檢測本地計算機與宿主計算機的連通性。<BR>
TidIcmpClient控件的主要事件:<BR>
OnICMPReply(ASender: TComponent; const AReplyStatus: TReplyStatus):在本地計算機接收到宿主計算機回應時觸發,回收消息放在對象AreplyStatus中。<BR>
三、編程實現<BR>
下面我們就來制作一個圖形界面的Ping程序。<BR>
1、啟動Delphi6.0,打開一個新的標准工程。在窗體中添加所需的控件。<BR>
首先向窗體頂端添加一個Panel控件,在其上再依次添加一個Label、Edit和兩個Button控件,並修改Button控件的標題為“Ping”和“Clear”,然後再在Panel下面添加一個ListBox控件,最後再添加一個ICMP控件,並修改其名字屬性為“ICMP”。依次設置其有關的屬性等,修改後的窗體界面如圖2所示。<BR>
<BR>
<IMG BORDER="0" SRC="http://www.bkjia.com/uploads/allimg/131209/16035a600-0.gif" WIDTH="16" HEIGHT="16">此主題相關圖片如下:<BR>
<A HREF="http://www.bkjia.com/uploads/allimg/131209/1603591R2-3.jpg" TARGET="_blank"><IMG ALT="按此在新窗口浏覽圖片" BORDER="0" ONLOAD="javascript:if(this.width>screen.width-333)this.width=screen.width-333" SRC="http://www.bkjia.com/uploads/allimg/131209/1603591R2-3.jpg" WIDTH="442" HEIGHT="293"></A><BR>
<BR>
2、Edit1控件是實現IP地址或者計算機名字的輸入的, Button1則是實現Ping功能的,將其Default屬性設為True,這樣當用戶按下回車鍵時,可以直接實現Ping功能。其主要的代碼段如下:<BR>
procedure TForm1.Button1Click(Sender: TObject);<BR>
var<BR>
i : integer;<BR>
begin<BR>
ICMP.Host := Edit1.Text ; file://宿主計算機的名稱或IP地址<BR>
ICMP.ReceiveTimeout := 1000; file://最大等待時間<BR>
Button1.Enabled := false;<BR>
try<BR>
for i:=0 to 3 do file://重復4次<BR>
begin<BR>
ICMP.Ping ;<BR>
Application.ProcessMessages ; file://延時<BR>
end;<BR>
finally<BR>
Button1.Enabled := true;<BR>
end;<BR>
end;<BR>
3、當本地計算機向宿主計算機發送一個數據包,當本地計算機接收到宿主計算機的信息時,會觸發ICMPReply事件,可以在這個事件中實現對回收信息的顯示或者差錯等。其主要的代碼段如下:<BR>
<P>procedure TForm1.ICMPReply(ASender: TComponent;<BR>
const AReplyStatus: TReplyStatus);<BR>
var<BR>
sTime: string;<BR>
begin<BR>
file://檢測Ping的回復錯誤<BR>
if (AReplyStatus.MsRoundTripTime = 0 ) then<BR>
sTime := <1<BR>
else<BR>
sTime := =;</P>
<P> file://在列表框中顯示Ping消息<BR>
ListBox1.Items.Add(Format(ICMP_SEQ=%d Reply from %s [%s] : Bytes=%d time%s%d ms TTL=%d,<BR>
[AReplyStatus.SequenceId,<BR>
Edit1.Text,<BR>
AReplyStatus.FromIpAddress,<BR>
AReplyStatus.BytesReceived,<BR>
sTime,<BR>
AReplyStatus.MsRoundTripTime,<BR>
AReplyStatus.TimeToLive]));<BR>
end;<BR>
</P>
4、Button2按鈕是實現對列表框的清除功能的,代碼段如下:<BR>
procedure TForm1.Button2Click(Sender: TObject);<BR>
begin<BR>
ListBox1.Clear ;<BR>
end;<BR>
編譯上面的程序,一個圖形化的Ping程序就這樣輕輕松松的展現在您的面前了,是不是很酷?實際上我們還可以通過Delphi6提供的Indy控件組,實現其它的網絡程序。自己做一下,你會發現,你在做這些時其實很簡單,因為Delphi6已經為程序員做了許多工作。好了,大家如果有什麼問題歡迎發信到[email protected],大家共同進步吧。<BR>
程序在Windows2000中文版、Delphi6.0下編譯通過。</P>
<P><SPAN CLASS="TEXTFONT">作者:耿百強<BR>
地址:中共河南省濟源市委黨校<BR>
郵政編碼:454650<BR>
聯系電話:0391-6666267<BR>
E-Mail:[email protected]<BR>
OICQ:10562208<BR>
寫稿日期:2002-3-12<BR>
</SPAN></P>
<P><BR>
</P>
</FONT>
</BODY>