請問如何得知區域網絡內的電腦是否己聯接 |
答題得分者是:flyup
|
naposhao
初階會員 ![]() ![]() 發表:18 回覆:38 積分:31 註冊:2002-10-13 發送簡訊給我 |
|
flyup
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:280 回覆:508 積分:385 註冊:2002-04-15 發送簡訊給我 |
用Delphi打造圖形界面的Ping程序 摘要:本文主要介紹利用Delphi6實現一個圖形界面Ping程序的方法,其中主要討論了ICMP協議和ICMP協議元件及其編程方法,並給出了一個實例程序。解決了Ping命令行程序的缺點。
關鍵詞:Delphi,ICMP協議,Ping程序 操作系統:Windows 2000 Server 中文版
編程工具:Delphi 6.0 一、 前言
在日常網路管理時,我們常用Ping命令來測試是否能與宿主(或路由)連通。但它一般是以命令行的形式提供給我們,不僅使用不方便,而且命令執行速度較快時,常常使我們看不清執行結果。那麼,有沒有辦法來解決這個矛盾呢?答案當然是肯定的。下面,我們將利用Delphi強大的網路編程功能來實現一個圖形化的Ping程序,程序的執行界面如圖1所示。 程序的主要功能:在Address後的編輯框中可以輸入一個計算機的名稱或者IP地址,然後按Ping按鈕或直接按回車可以測試與宿主計算機的連通性,如果連能正常,則在下面的列表框中顯示宿主計算機的IP地址等信息。可以通過Clear功能按鈕實現對列表框信息的清除。
二、 編程原理
ICMP(Internet Control Messages Protocol)是Internet信報控制協議的簡寫,它將報文放在一個IP資料報的資料部分中通過網路傳送,該協議允許路由器向其它的路由器或者主機發送並且回收差錯與控制報文,它為發生差錯的路由器提供了向源端報告差錯的功能。連通性測試程序Ping正是利用了ICMP協議的這種特性,通過向目的端(宿主)發送並且回收信報來測試端到端的連通性。
Delphi6.0新增了Indy網路元件組,包括了幾乎所有的網路協議元件,比如SMTP、POP3、SNMP及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程序。
1、啟動Delphi6.0,打開一個新的標準工程。在視窗中添加所需的元件。
首先向視窗頂端添加一個Panel元件,在其上再依次添加一個Label、Edit和兩個Button元件,並修改Button元件的標題為"Ping"和"Clear",然後再在Panel下面添加一個ListBox元件,最後再添加一個ICMP元件,並修改其名字屬性為"ICMP"。依次設置其有關的屬性等,修改後的視窗界面如圖1所示。 2、Edit1元件是實現IP地址或者計算機名字的輸入的, Button1則是實現Ping功能的,將其Default屬性設為True,這樣當用戶按下輸入鍵時,可以直接實現Ping功能。其主要的程式碼段如下:
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
ICMP.Host := Edit1.Text ; //宿主計算機的名稱或IP地址
ICMP.ReceiveTimeout := 1000; //最大等待時間
Button1.Enabled := false;
try
for i:=0 to 3 do //重複4次
begin
ICMP.Ping ;
Application.ProcessMessages ; //延時
end;
finally
Button1.Enabled := true;
end;
end;
3、當本地計算機向宿主計算機發送一個資料包,當本地計算機接收到宿主計算機的信息時,會觸發ICMPReply事件,可以在這個事件中實現對回收信息的顯示或者差錯等。其主要的程式碼段如下:
procedure TForm1.ICMPReply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
var
sTime: string;
begin
//檢測Ping的回復錯誤
if (AReplyStatus.MsRoundTripTime = 0 ) then
sTime := '<1'
else
sTime := '='; //在列表框中顯示Ping消息
ListBox1.Items.Add(Format('ICMP_SEQ=%d Reply from %s [%s] : Bytes=%d time%s%d ms TTL=%d',
[AReplyStatus.SequenceId,
Edit1.Text,
AReplyStatus.FromIpAddress,
AReplyStatus.BytesReceived,
sTime,
AReplyStatus.MsRoundTripTime,
AReplyStatus.TimeToLive]));
end;
4、Button2按鈕是實現對列表框的清除功能的,程式碼段如下:
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear ;
end;
編譯上面的程序,一個圖形化的Ping程序就這樣輕輕鬆鬆的展現在您的面前了,是不是很酷?實際上我們還可以通過Delphi6提供的Indy元件組,實現其它的網路程序。自己做一下,你會發現,你在做這些時其實很簡單,因為Delphi6已經為程序員做了許多工作。好了,大家如果有什麼問題歡迎發信到romanticonline@hotmail.com,大家共同進步吧。
程序在Windows2000中文版、Delphi6.0下編譯通過
![]() |
flyup
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:280 回覆:508 積分:385 註冊:2002-04-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |