三,、使用Win API調(diào)用ICMP.DLL實(shí)現(xiàn),、 在這里需要注意的一點(diǎn)是,Windows平臺實(shí)現(xiàn)ping功能,如果需要使用到IcmpParseReplies函數(shù),,需要涉及到兩個動態(tài)庫Icmp.dll和Iphlpapi.dll,。IcmpParseReplies函數(shù)在Windows2000上面由Icmp.dll導(dǎo)出,而在 Windows XP及以后的版本是由Iphlpapi.dll導(dǎo)出的,。通過調(diào)用LoadLibrary和GetProcAddress來檢測IcmpParseReplies由哪個動態(tài)庫導(dǎo)出,。優(yōu)先判斷Iphlpapi.dll是否存在且有導(dǎo)出此函數(shù),,如果存在就使用此動態(tài)庫,否則再判斷Icmp.dll,。 另外隨著IP6的使用,,如果業(yè)務(wù)上涉及到這一塊,也應(yīng)該要留意,。 常用的函數(shù)有三個:IcmpCreateFile,、IcmpSendEcho、IcmpCloseHandle,。具體使用見下實(shí)例,。
你可能會發(fā)現(xiàn),用IcmpSendEcho 測試 127.0.0.1的時候,ICMP_ECHO_REPLY.RoundTripTime 會等于0
其實(shí),這個函數(shù)是沒有出錯的,即使用Ping 127.0.0.1也是可以的 那么應(yīng)該怎么去判斷這個函數(shù)出錯呢? 用 ICMP_ECHO_REPLY.Status 來獲得測試狀態(tài)(記住,當(dāng)Status為0的時候,函數(shù)是正確運(yùn)行的)
要了解Ping的原理,,我們先來了解下ping命令的使用 通過發(fā)送“網(wǎng)際消息控制協(xié)議 (ICMP)”回響請求消息來驗(yàn)證與另一臺 TCP/IP 計算機(jī)的 IP 級連接,。回響應(yīng)答消息的接收情況將和往返過程的次數(shù)一起顯示出來,。Ping 是用于檢測網(wǎng)絡(luò)連接性,、可到達(dá)性和名稱解析的疑難問題的主要 TCP/IP 命令。 語法 ping [-t] [-a] [-n Count] [-l Size] [-f] [-i TTL] [-v TOS] [-r Count] [-s Count] [{-j HostList | -k HostList}] [-w Timeout] [TargetName] -t 指定在中斷前 ping 可以持續(xù)發(fā)送回響請求信息到目的地,。要中斷并顯示統(tǒng)計信息,,請按 CTRL-BREAK,。要中斷并退出 ping,請按 CTRL-C,。 -a 指定對目的地 IP 地址進(jìn)行反向名稱解析,。如果解析成功,ping 將顯示相應(yīng)的主機(jī)名,。 -n Count 指定發(fā)送回響請求消息的次數(shù),。默認(rèn)值為 4。 -lSize 指定發(fā)送的回響請求消息中“數(shù)據(jù)”字段的長度(以字節(jié)表示),。默認(rèn)值為 32,。size 的最大值是 65,527。 -f 指定發(fā)送的回響請求消息帶有“不要拆分”標(biāo)志(所在的 IP 標(biāo)題設(shè)為 1),?;仨懻埱笙⒉荒苡赡康牡芈窂缴系穆酚善鬟M(jìn)行拆分。該參數(shù)可用于檢測并解決“路徑最大傳輸單位 (PMTU)”的故障,。 -i TTL 指定發(fā)送回響請求消息的 IP 標(biāo)題中的 TTL 字段值,。其默認(rèn)值是是主機(jī)的默認(rèn) TTL 值。對于 Windows XP 主機(jī),,該值一般是 128,。TTL 的最大值是 255。 -v TOS 指定發(fā)送回響請求消息的 IP 標(biāo)題中的“服務(wù)類型 (TOS)”字段值,。默認(rèn)值是 0,。TOS 被指定為 0 到 255 的十進(jìn)制數(shù)。 -r Count 指定 IP 標(biāo)題中的“記錄路由”選項(xiàng)用于記錄由回響請求消息和相應(yīng)的回響應(yīng)答消息使用的路徑,。路徑中的每個躍點(diǎn)都使用“記錄路由”選項(xiàng)中的一個值,。如果可能,可以指定一個等于或大于來源和目的地之間躍點(diǎn)數(shù)的 Count,。Count 的最小值必須為 1,,最大值為 9。 -s Count 指定 IP 標(biāo)題中的“Internet 時間戳”選項(xiàng)用于記錄每個躍點(diǎn)的回響請求消息和相應(yīng)的回響應(yīng)答消息的到達(dá)時間,。Count 的最小值必須為 1,,最大值為 4。 -jPath 指定回響請求消息使用帶有 HostList 指定的中間目的地集的 IP 標(biāo)題中的“稀疏資源路由”選項(xiàng),??梢杂梢粋€或多個具有松散源路由的路由器分隔連續(xù)中間的目的地。主機(jī)列表中的地址或名稱的最大數(shù)為 9,,主機(jī)列表是一系列由空格分開的 IP 地址(帶點(diǎn)的十進(jìn)制符號),。 -k HostList 指定回響請求消息使用帶有 HostList 指定的中間目的地集的 IP 標(biāo)題中的“嚴(yán)格來源路由”選項(xiàng)。使用嚴(yán)格來源路由,,下一個中間目的地必須是直接可達(dá)的(必須是路由器接口上的鄰居),。主機(jī)列表中的地址或名稱的最大數(shù)為 9,,主機(jī)列表是一系列由空格分開的 IP 地址(帶點(diǎn)的十進(jìn)制符號)。 -w Timeout 指定等待回響應(yīng)答消息響應(yīng)的時間(以微妙計),,該回響應(yīng)答消息響應(yīng)接收到的指定回響請求消息,。如果在超時時間內(nèi)未接收到回響應(yīng)答消息,將會顯示“請求超時”的錯誤消息,。默認(rèn)的超時時間為 4000(4 秒 ),。 TargetName 指定目的端,它既可以是 IP 地址,,也可以是主機(jī)名,。 /? 在命令提示符顯示幫助。
每個ICMP報文都有自己的格式,,但它們開始的三個字段都是一樣的:一個8位的報文類型(type)用來標(biāo)識報文,,一個8位的代碼(code)用來 提供有關(guān)類型的進(jìn)一步信息,一個16位的校驗(yàn)和(checksum),。(ICMP采用和IP相同的校驗(yàn)和算法,,但I(xiàn)CMP校驗(yàn)和只覆蓋ICMP報文)。這 里我們給出ICMP報文首部的數(shù)據(jù)結(jié)構(gòu): struct ICMPHEADER { BYTE i_type; // 類型 BYTE i_code; // 代碼 USHORT i_cksum; // 首部校驗(yàn)和 USHORT i_id; // 標(biāo)識 USHORT i_seq; // 序列號 ULONG timestamp; // 時間戳(選用) }; 下表表示了ICMP的報文類型及其含義:
言必信,,行必果。歡迎訪問我的博客,。
|
|