traceroute程序設(shè)計(jì)與實(shí)現(xiàn)_第1頁
traceroute程序設(shè)計(jì)與實(shí)現(xiàn)_第2頁
traceroute程序設(shè)計(jì)與實(shí)現(xiàn)_第3頁
traceroute程序設(shè)計(jì)與實(shí)現(xiàn)_第4頁
traceroute程序設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、19Traceroute程序設(shè)計(jì)與實(shí)現(xiàn)學(xué)生姓名:樊冠宇指導(dǎo)老師:姜文超摘 要 本文主要講述了路由追蹤的基本程序設(shè)計(jì)與實(shí)現(xiàn),并給出了一種基 于IP網(wǎng)絡(luò)的路由追蹤命令Tracer1詳細(xì)分析了實(shí)現(xiàn)路由追蹤的基本原理,歸納了 路由追蹤的基本流程。Tracer®過ICMP協(xié)議和I P headerTT L (存活時(shí)間) 利用路由器對(duì)數(shù)據(jù)報(bào)存活時(shí)間的處理方式來實(shí)現(xiàn)路由探測的。首先根據(jù)任務(wù)書設(shè)計(jì)好流程圖,然后編寫程序代碼,運(yùn)行得到Traceroute的命令窗口。提取tracert 的輸出,再結(jié)合現(xiàn)有IP數(shù)據(jù)庫及自建地名-坐標(biāo)數(shù)據(jù)庫對(duì)路由中各節(jié)點(diǎn)IP進(jìn)行定 位,最終實(shí)現(xiàn)了動(dòng)態(tài)顯示追蹤的詳細(xì)信息和路徑

2、。關(guān)鍵詞:IP 地址,ICMPB議,TTL, Tracert路由追蹤1引言Internet,是目前世界上最大的計(jì)算機(jī)網(wǎng)絡(luò),更確切的說是網(wǎng)絡(luò)中的網(wǎng)絡(luò), 它由遍布全球的幾萬局域網(wǎng)和數(shù)百萬臺(tái)計(jì)算機(jī)組成,并通過用于異構(gòu)網(wǎng)絡(luò)的 TCP/IP協(xié)議進(jìn)行網(wǎng)間通信?;ヂ?lián)網(wǎng)中,信息的傳送是通過網(wǎng)中許多段的傳輸介 質(zhì)和設(shè)備從一端到達(dá)另一端。每一個(gè)連接在Internet上的設(shè)備,如主機(jī)、路由器、接入服務(wù)器等一般情況下都會(huì)有一個(gè)獨(dú)立的IP地址。通過Traceroute我們可以知道信息從你的計(jì)算機(jī)到互聯(lián)網(wǎng)另一端的主機(jī)是走的什么路勁。當(dāng)然每次數(shù)據(jù)包由某一同樣的出發(fā)點(diǎn)到達(dá)某一同樣的目的地走的路勁可能會(huì)不同,但基本上來說大部分

3、時(shí)候所走的路由是相同的。隨著 Internet (國際互聯(lián)網(wǎng))的發(fā)展, 越來越多的服務(wù)通過網(wǎng)絡(luò)提供給大眾,與此同時(shí),針對(duì)互聯(lián)網(wǎng)的攻擊事件也越來越頻繁。所謂路由追蹤實(shí)際上就是在IP網(wǎng)絡(luò)上判斷從源到達(dá)目的所經(jīng)過的路由器的IP地址,其基本的實(shí)現(xiàn)手段都是向目的地發(fā)送數(shù)據(jù)包以獲取經(jīng)過的路由器 的IP。由于Internet上的路由協(xié)議是動(dòng)態(tài)的,所以每次形成的數(shù)據(jù)包從同一個(gè) 出發(fā)點(diǎn)到達(dá)目的地的路由可能會(huì)不一樣,但由于路由算法有一定的穩(wěn)定性,在大部分時(shí)侯所走的路由會(huì)是相同的。1.1課程設(shè)計(jì)目的1.這次課程設(shè)計(jì),主要為了加深同學(xué)們對(duì)計(jì)算機(jī)網(wǎng)絡(luò)網(wǎng)絡(luò)的理解和認(rèn)識(shí) 2.了解信息在計(jì)算機(jī)網(wǎng)絡(luò)與網(wǎng)絡(luò)之間的傳送和接收3 .

4、進(jìn)一步加深了解網(wǎng)絡(luò)與網(wǎng)絡(luò)之間的協(xié)議4 .理解網(wǎng)絡(luò)中的IP地址以及路由之間的相關(guān)命令。1.2課程設(shè)計(jì)內(nèi)容1 .已知參數(shù):輸入:目的節(jié)點(diǎn)IP地址或主機(jī)名;輸出:從控制臺(tái)屏幕輸出IP報(bào)文由本機(jī)出發(fā)到達(dá)目的主機(jī)所經(jīng)過的路由信息。2 .設(shè)計(jì)要求:通過原始套接字編程,實(shí)現(xiàn) Tracert的基本功能2.1 初始化 Windows Sockets網(wǎng)絡(luò)環(huán)境;2.2 解析命令行參數(shù),構(gòu)造目的端 socket地址;2.3 定義IP、ICMP艮文;2.4 接收ICMPg錯(cuò)報(bào)文并進(jìn)行解析。2.5 課程設(shè)計(jì)要求(1)按要求編寫課程設(shè)計(jì)報(bào)告書,能正確闡述設(shè)計(jì)結(jié)果。(2)通過課程設(shè)計(jì)培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真的工作作風(fēng)和團(tuán)

5、隊(duì)協(xié)作精神。(3)學(xué)會(huì)文獻(xiàn)檢索的基本方法和綜合運(yùn)用文獻(xiàn)的能力。(4)在老師的指導(dǎo)下,要求每個(gè)學(xué)生獨(dú)立完成課程設(shè)計(jì)的全部內(nèi)容。2設(shè)計(jì)原理raceroute一個(gè)路由跟蹤命令,它通過ICMP協(xié)議和I P heade葉T T L(存活時(shí)間)來實(shí)現(xiàn)的。具體而言就是:發(fā)送方發(fā)出一個(gè)TTL是1的 IPDatagram (事實(shí)上每個(gè)數(shù)據(jù)包發(fā)送三次, 大小為40字節(jié),包括本機(jī)的IP地址, 目的主機(jī)的IP地址以及時(shí)間戳),當(dāng)經(jīng)由第一個(gè)路由器時(shí),路由器將該數(shù)據(jù)包的 TTL減1,發(fā)現(xiàn)此時(shí)的TTL為0,將數(shù)據(jù)包丟失,同時(shí)向源主機(jī)發(fā)送一個(gè) ICMP Time-to-Exceed報(bào)文(包括源主機(jī)的IP地址、路由地址以及路由

6、的相關(guān)消息), 源主機(jī)收到這個(gè)數(shù)據(jù)包后就知道了這個(gè)路由器在這條路徑上。同理發(fā)送第二個(gè)、 第三個(gè)第n個(gè)。源主機(jī)將每次I P數(shù)據(jù)報(bào)的T T L+ 1 ,直到某個(gè)數(shù)據(jù)報(bào)到 達(dá)了目的地址,此時(shí)不知發(fā)回一個(gè)ICMPTime-to-Exceed,而是發(fā)送一個(gè)數(shù)據(jù)報(bào)的響應(yīng)報(bào)文。當(dāng)源主機(jī)收到這樣一個(gè)報(bào)文后便知道數(shù)據(jù)包已 經(jīng)到達(dá)了目的地。Traceroute提取發(fā)ICMP TTL到期消息設(shè)備的IP地址并作域 名解析。每次,Traceroute都打印出一系列數(shù)據(jù),包括所經(jīng)過的路由設(shè)備的域名 及IP地址,三個(gè)包每次來回所花時(shí)間。Traceroute有一個(gè)固定的時(shí)間等待響應(yīng)(ICMP TTL到期消息)。如果這個(gè)時(shí)間過

7、了,它將打印出一系列的*號(hào)表明:在這 個(gè)路徑上,這個(gè)設(shè)備不能在給定的時(shí)間內(nèi)發(fā)出ICMP TTL到期消息的響應(yīng)。然后,Traceroute給TTL記數(shù)器力口 1,繼續(xù)進(jìn)行2.1ICMP簡介和基本原理ICMP(Internet Control Message Protocol)即 Internet 控制報(bào)文協(xié)議,它是TCP/IP協(xié)議族的一個(gè)子協(xié)議,屬于網(wǎng)絡(luò)層面向無連接的協(xié)議,主要用于在主機(jī)與 路由器之間傳遞控制信息,包括報(bào)告錯(cuò)誤、交換受限控制和狀態(tài)信息等。當(dāng)遇到 IP數(shù)據(jù)無法訪問目標(biāo)、IP路由器無法按當(dāng)前的傳輸速率轉(zhuǎn)發(fā)數(shù)據(jù)包等情況時(shí), 會(huì)自動(dòng)發(fā)送ICMP消息。ICMP報(bào)文被包裝成IP數(shù)據(jù)包傳到數(shù)據(jù)

8、鏈路層進(jìn)行傳輸。通過ICMP協(xié)議,主機(jī)和路由器可以報(bào)告錯(cuò)誤并交換相關(guān)的狀態(tài)信息。ICMP對(duì)于TCP/IP協(xié)議的可靠運(yùn)行是至關(guān)重要的。ICMP報(bào)文結(jié)構(gòu)如圖1所示:07 815 16318位類型 X位代碣16位校瞼和(不同類型和代碼有不同的內(nèi)容)圖1 CMP報(bào)文結(jié)構(gòu)2.2traceRoute程序的基本原理路由追蹤的主要原理是根據(jù)路徑上各路由器對(duì)數(shù)據(jù)報(bào)的存活時(shí)(Time toLive , TTL)做不同的處理,使其產(chǎn)生超時(shí)ICMP消息響應(yīng),反饋至源主機(jī),從而獲 得此跳路由器或主機(jī)的IP。照此再發(fā)送下一個(gè)TTL經(jīng)過自增的數(shù)據(jù)報(bào),直至獲得 整個(gè)路由中各節(jié)點(diǎn)的IP或者接收到錯(cuò)誤的消息。詳細(xì)過程描述如下:1

9、)置n = 1 o假設(shè)該過程中共經(jīng)過 M個(gè)路由器。2)源主機(jī)S向目標(biāo)主機(jī)D發(fā)送一個(gè)TTL為n的UDPS:據(jù)報(bào)。并設(shè)定端口號(hào)(一 股大于30 000)。3)路由器(或者網(wǎng)關(guān)、主機(jī))Rn對(duì)接收到的數(shù)據(jù)報(bào)的TTL值n做減1處理。4)若n = 0,則丟棄UD嗷據(jù)報(bào),向源主機(jī)S發(fā)送ICMP®時(shí)報(bào)文。5)若n>1 ,繼續(xù)向目標(biāo)主機(jī)D發(fā)送經(jīng)過處理的數(shù)據(jù)報(bào)。6)源主機(jī)S分析返回的ICMP®文,從中提取出發(fā)送者Rn的地址IPn并做 記錄。7)若收到“端口不可達(dá)”的ICMP報(bào)文,則發(fā)送方即目標(biāo)主機(jī)D,記錄其地址IPn,追蹤完成。8)置n = n +1,繼續(xù)向目標(biāo)主機(jī)D發(fā)送TTL為n的數(shù)據(jù)

10、報(bào)。注意,這里使UD嚶?lián)?bào)的端口號(hào)大于30000,是因?yàn)橐话愕膽?yīng)用程序不可能 使用如此高的端口號(hào)。當(dāng)然這并非絕對(duì),若出現(xiàn)例外,則源主機(jī)會(huì)發(fā)現(xiàn)等待超時(shí), 于是隨機(jī)改變此UDPt據(jù)報(bào)的端口號(hào),再次發(fā)送。這樣最終可以在目標(biāo)主機(jī)上找 到一個(gè)空閑的端口號(hào)。另外,這里假設(shè)路由器和目標(biāo)主機(jī)沒有被配置為“過濾 ICMP或者做了其他的非常規(guī)處理,如果被做了類似的配置,則上面的追蹤機(jī)制就 無能為力了。2.3traceRoute實(shí)現(xiàn)的功能IP數(shù)據(jù)報(bào)的首部由兩部分構(gòu)成:固定部分和可變部分。固定部分的長度是 20個(gè)字段,可變部分由許多選項(xiàng)構(gòu)成,最長可達(dá)40個(gè)字節(jié)。雖然選項(xiàng)并不是IP 數(shù)據(jù)報(bào)的必需部分,但選項(xiàng)的處理卻是

11、IP軟件的必需部分。在現(xiàn)在的TCP/IP協(xié)議中,只定義了六種選項(xiàng),對(duì)于我們進(jìn)行路由追蹤技術(shù) 有用的是記錄路由選項(xiàng),一個(gè)記錄路由選項(xiàng)是用來記錄處理IP數(shù)據(jù)報(bào)的互聯(lián)網(wǎng)路由器的IP地址。因?yàn)槭撞康淖畲箝L度是 60個(gè)字節(jié),它包括20個(gè)字節(jié)的基本 首部。這就意味著只剩下40個(gè)字節(jié)留下給選項(xiàng)部分,所以通過選項(xiàng)字段最多能 夠記錄9個(gè)路由器的IP地址。源站在選項(xiàng)中創(chuàng)建一個(gè)位標(biāo)置(placeholder ), 用來填入所經(jīng)過的各路由器,圖2給出了記錄路由選項(xiàng)的格式。圖2記錄路由選項(xiàng)向目的主機(jī)發(fā)送一個(gè)ICMP報(bào)文,這種方法只要求使用一個(gè)套接字。ICMP即Internet 控制報(bào)文協(xié)議,是一種用于特殊用途的報(bào)文機(jī)制

12、,可以使互聯(lián)網(wǎng)中的路由器或主機(jī)報(bào)告差錯(cuò)或提供有關(guān)意外情況的信息。盡管UDP和ICMP工作在TCP/IP的不同層次上,但他們的封裝是類似的。ICMP報(bào)文為兩級(jí)封裝ICMP報(bào)文 放在IP數(shù)據(jù)報(bào)的數(shù)據(jù)部分,數(shù)據(jù)報(bào)則放在幀的數(shù)據(jù)中進(jìn)行網(wǎng)絡(luò)傳輸(如圖 3所 示)ICMP報(bào)文與其他普通報(bào)文一樣,具有相同的路由選擇,并沒有特殊的優(yōu)先 權(quán)和增加可靠性。通過路由選項(xiàng)的方法記錄路由的實(shí)現(xiàn)同UD吸據(jù)報(bào)是相似的,這里主要說明通過TTL方法的實(shí)現(xiàn)。3設(shè)計(jì)步驟分析本次課程設(shè)計(jì)的任務(wù)書,整個(gè)課程設(shè)計(jì)的過程大致可以分為三個(gè)步驟: 第一步主要是設(shè)計(jì)好流程圖;第二步是根據(jù)流程圖編寫程序代碼;第三步是在程 序編譯通過后,運(yùn)行程序結(jié)

13、果,在對(duì)話框中輸入要追蹤的IP地址,觀察路由追蹤命令追蹤IP地址在網(wǎng)絡(luò)中的運(yùn)行。其中第一步跟第二步是關(guān)鍵,只有完整的 流程圖和根據(jù)要求編寫好正確的程序,才能運(yùn)行得到正確的結(jié)果。下面是整個(gè)設(shè) 計(jì)過程中各個(gè)步驟的詳細(xì)分析。3.1traceroute 流程圖根據(jù)要求設(shè)計(jì)好的流程圖如圖4所示:圖4流程圖3.2traceroute的核心程序整個(gè)設(shè)計(jì)過程的核心程序代碼:#include "stdafx.h"#include "MyPing.h"#include "Ping.h"#include "MyPingDlg.h"#if

14、def _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endifvoid CPing:Ping(int timeout) m_hSocket = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,WSA_FLAG_OVERLAPPED);if (m_hSocket = INVALID_SOCKET)AfxMessageBox("socket 創(chuàng)建失敗!”);return ;Start sending/receiving ICMP p

15、ackets開始發(fā)送/接收 ICMP 的數(shù)據(jù)包/static int nCount = 0;靜態(tài)的 nCount = 0int nCount=0;while(1)int bwrote;if (nCount+ = 4)break;(IcmpHeader*)icmp_data)->i_cksum = 0;(IcmpHeader*)icmp_data)->timestamp = GetTickCount();(IcmpHeader*)icmp_data)->i_seq = seq_no+;(IcmpHeader*)icmp_data)->i_cksum = checksum(

16、USHORT*)icmp_data, datasize);bwrote = sendto(m_hSocket, icmp_data, datasize, 0, (struct sockaddr*)&m_addrDest, sizeof(m_addrDest);if (bwrote = SOCKET_ERROR) if (WSAGetLastError() = WSAETIMEDOUT)m_dlg->m_result+="Timed out ! rn"m_dlg->SetDlgItemText(IDC_EDIT2,m_dlg->m_result);c

17、ontinue; AfxMessageBox("發(fā)送數(shù)據(jù)函數(shù)調(diào)用錯(cuò)誤!");return ;3.3traceroute程序運(yùn)行結(jié)果在運(yùn)行程序后得到的TraceRout e對(duì)話框中輸入 ,再單擊路由跟蹤,就可以詳細(xì)的觀察到路由整個(gè)的跟蹤過程,如圖5所示:乏TraceRout e路由跟蹤wttw.三ina; com|跟蹤報(bào)告 開始跟蹤.目標(biāo)二 ffw. 5in盤, ccm 172.15.20 2540 ms12.169,20.450 ms192. 16S.20.£010 4210,43.1g2.1300113.240.233.10 bi222.Z47.20.153 1

18、5 g 61 137.0 49 口 ms 202 9r 56 1 的 16 ms SB. 49.3.1820 as10 221.235.54 1g4 16 ns 跟:新完成n圖5路由跟蹤示意圖4總結(jié)在整個(gè)課程設(shè)計(jì)過程中,首先得仔細(xì)分析課程設(shè)計(jì)任務(wù)書,根據(jù)要求編寫好 程序代碼,然后運(yùn)行程序,分析得到的結(jié)果。在編寫代碼過程中,遇到許多問題。 開始看到題目不知道該如何下手去做。編寫好的代碼,在VC+坪臺(tái)上運(yùn)行時(shí),總是出現(xiàn)錯(cuò)誤,最終在老師的幫助下,成功的解決了該問題。還有在宿舍 運(yùn)行 tracert后一閃就沒了,也不知道是什么原因,上網(wǎng)查找了解到,必須得先運(yùn)行CMD, 然后在CMD1運(yùn)行其他命令。成功

19、的運(yùn)行tracert后,出現(xiàn)的一連串?dāng)?shù)字,不知 道是什么意思,結(jié)合老師上課所講的東西并仔細(xì)分析才知道,192.168.20.45是IP地址,0ms是跳到下個(gè)IP地址所用的時(shí)間。從整體來說這次課程設(shè)計(jì)是成功 的。但中間存在一些細(xì)節(jié)問題,程序代碼過于復(fù)雜,沒有很好的用語句解釋出程 序中的代碼。每次課程設(shè)計(jì)都讓我們學(xué)到了很多書本上學(xué)不到的東西,如嚴(yán)謹(jǐn)?shù)淖鍪嘛L(fēng)格,認(rèn)真學(xué)習(xí)的態(tài)度,不懂要問的道理。因此,我們應(yīng)該要認(rèn)認(rèn)真真的做 好每一次的課程設(shè)計(jì)。5結(jié)束語通過這次課程設(shè)計(jì),加強(qiáng)了我們動(dòng)手、思考和解決問題的能力,讓我們對(duì)網(wǎng) 絡(luò)和網(wǎng)絡(luò)之間的信息和數(shù)據(jù)的傳送以及相關(guān)的協(xié)議有了更深刻的理解。在這次課程設(shè)計(jì)中,tr

20、acerroute 通過ICMP協(xié)議和I P header中TTL (存活時(shí)間) 利用路由器對(duì)數(shù)據(jù)報(bào)存活時(shí)間的處理方式成功的實(shí)現(xiàn)路由探測。跟蹤到網(wǎng)絡(luò)中數(shù)據(jù)IP地址的移動(dòng),但在跟蹤過程中經(jīng)常發(fā)生數(shù)據(jù)的丟失和網(wǎng)絡(luò)超時(shí)。我認(rèn)為做課程設(shè)計(jì)同時(shí)也是對(duì)課本知識(shí)的鞏固和加強(qiáng),由于課本的知識(shí)太 多,平時(shí)課間的學(xué)習(xí)并不能很好的理解和運(yùn)用,而且考試內(nèi)容有限,所以在這次課程設(shè)計(jì)過程中,我們了解了很多網(wǎng)絡(luò)之間的協(xié)議和路由跟蹤的命令,并對(duì)抽象的網(wǎng)絡(luò)有了更多的認(rèn)識(shí)。然而,認(rèn)識(shí)來源于實(shí)踐,實(shí)踐是認(rèn)識(shí)的動(dòng)力和最終目的,實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),所以這次課程設(shè)計(jì)對(duì)我們來說是受益匪淺。 對(duì)我們 而言,知識(shí)上的收獲重要,精神上的豐

21、收更是可喜。挫折是一份財(cái)富,經(jīng)歷是一 份擁有,通過這次課程設(shè)計(jì)讓我懂得了理論與實(shí)踐相結(jié)合的重要性。只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,必須把平時(shí)所學(xué)的理論知識(shí)與實(shí)踐結(jié)合起來, 從理論中得出結(jié) 論,才能真正的利用所學(xué)的東西為社會(huì)服務(wù), 從而提高自己的實(shí)際動(dòng)手能力和獨(dú) 立思考的能力。在設(shè)計(jì)的過程中遇到這樣那樣的難題, 但是,在老師和同學(xué)們的 幫助下,都順利的解決了,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處, 對(duì)以前 所學(xué)過的知識(shí)理解的不夠深刻,掌握的不夠牢固。這次課程設(shè)計(jì),讓我學(xué)到了很多課內(nèi)學(xué)不到的東西, 比如團(tuán)體合作,出現(xiàn)差 錯(cuò)的隨機(jī)應(yīng)變等,那都是受益匪淺。在此,感謝我們指導(dǎo)老師的細(xì)心指導(dǎo),今后, 我會(huì)加倍

22、的努力學(xué)習(xí)。參考文獻(xiàn)1W Richard Stevens. TCP/ IP Illust rated ,Volum 1 :The ProtocolsM1 北京:機(jī)械工業(yè)出版社,2002.85296.2W Richard Stevens. UNIX Network ProgrammingVolum1NetworkingAPIs :Socket s and XTI ( SecondEdition)(影印版)M. 北京:清華大學(xué)出版社,2002.3日井口信和.TCP/IP網(wǎng)絡(luò)工具篇M.吳松芝,董江洪譯.北京:科學(xué)出版社,2003. 1582162.4余青霓,王曉程,周鋼,等.網(wǎng)絡(luò)入侵檢測分析員手冊(cè)Z

23、.北京:人民郵電出版 社,2000. 1012109.5JAMES F.KUROSE, KEITH W.Ross Computer Networking A Top2Down Approach Featuring the Internet ( 影印版)M.北京:高等教育出版社,2001.6李為民,趙迎新,梁濟(jì)仁,等.網(wǎng)絡(luò)連通性測試與故障定位J .計(jì)算機(jī)應(yīng)用,2004 ,24(增刊):47249.7張保通.基于路由器的防火墻設(shè)計(jì)J .華北航天工業(yè)學(xué)院學(xué) 報(bào),2002,(2):16219.附加程序清單:莫小鋒 通信0802班學(xué)號(hào):200885250224源程序:#include "std

24、afx.h"#include "TraceRoute.h"#include "Tracer.h"#include "TraceRouteDlg.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE#define new DEBUG_NEW#endif / Construction/Destruction/IPstruct IPHEADER unsigned inth_len:4;/ ITtB長度unsigned intversion:4;/版本unsigned

25、chartos;/服務(wù)類型unsigned shorttotal_len;/報(bào)文總長度unsigned shortident;/標(biāo)識(shí)unsigned shortfrag_and_flags;/偏移量unsigned charttl;/壽命unsigned charproto;/協(xié)議unsigned shortchecksum;/首部校驗(yàn)和unsigned intsourceIP;/源站IPunsigned intIdestIP;/目的站IP;/ICMP首部數(shù)據(jù)結(jié)構(gòu) struct ICMPHEADER BYTE i_type;/ 類型BYTE i_code;/ 代碼USHORT i_cksum;

26、/ 首部校驗(yàn)和USHORT i_id;USHORT i_seq;ULONG timestamp;/標(biāo)識(shí)/序列號(hào)/時(shí)間戳(選用);CTracer二CTracer() m_nSeq=1;icmpData=NULL;icmpRcvBuf=NULL;m_hSocket=INVALID_SOCKET;/初始化socketWSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) AfxMessageBox("WSAStartup()出錯(cuò)!");CTracer:CTracer()/夫'5 Socketif (m_h

27、Socket!=NULL)closesocket(m_hSocket);WSACleanup();/CheckSumUSHORT CTracer二CheckSum(char* pBuffer,int size)USHORT* buffer=(USHORT*)pBuffer;unsigned long cksum=0;while(size > 1)cksum += *buffer+;size -= sizeof(USHORT);if(size )cksum += *(UCHAR*)buffer;cksum = (cksum >> 16) + (cksum & 0xfff

28、f);cksum += (cksum >> 16);return (USHORT)(cksum);/FillAddressBOOL CTracer二FillAddress(char *addrDest) memset(&m_addrDest,0,sizeof(m_addrDest);m_addrDest.sin_family =AF_INET;if(inet_addr(addrDest)=INADDR_NONE)/輸入的地址為計(jì)算機(jī)名字HOSTENT* hp=NULL;hp=gethostbyname(addrDest);if(hp)memcpy(&(m_addrD

29、est.sin_addr),hp->h_addr,hp->h_length); m_addrDest.sin_family =hp->h_addrtype ; 一一一elseAfxMessageBox("獲取地址失?。 ?;return FALSE;elsem_addrDest.sin_addr.s_addr=inet_addr(addrDest); 一一 一 一return TRUE;/FillICMPDatavoid CTracer:FillICMPData(char* icmpData,int size)memset(icmpData,0,size);ICMP

30、HEADER* icmpHeader=NULL;icmpHeader=(ICMPHEADER*)icmpData;icmpHeader->i_type =ICMP_ECHO;icmpHeader->i_code =0;icmpHeader->i_id =(USHORT)GetCurrentProcessId();icmpHeader->i_seq =m_nSeq+;/GetTickCount返回從0點(diǎn)到現(xiàn)在的毫秒數(shù),作時(shí)間戳icmpHeader->timestamp=GetTickCount();char* datapart=icmpData+sizeof(ICM

31、PHEADER);memset(datapart,'*',size-sizeof(ICMPHEADER);/填充校驗(yàn)和icmpHeader->i_cksum =CheckSum(icmpData,size);/設(shè)置數(shù)據(jù)報(bào)的壽命BOOL CTracer:SetTTL(SOCKET hSocket, int ttl)int result;result=setsockopt(hSocket,IPPROTO_IP,IP_TTL,(LPSTR)&ttl,sizeof(ttl);if(result=SOCKET_ERROR)AfxMessageBox("設(shè)置數(shù)據(jù)報(bào)壽

32、命失敗!");TerminateProcess(GetCurrentProcess(),-1);return TRUE;/發(fā)送數(shù)據(jù)報(bào)BOOL CTracer二SendData(char* icmpData,int size)/填充ICMP報(bào)頭FillICMPData(icmpData,size);/發(fā)送數(shù)據(jù)報(bào)int result;time1=GetTickCount();result=sendto(m_hSocket,icmpData,size,0,(SOCKADDR*)&m_addrDest,sizeof( m_addrDest);if(result=SOCKET_ERRO

33、R)if(WSAGetLastError()=WSAETIMEDOUT)(CTraceRouteDlg*)m_pWnd)->InfoAdd("發(fā)送超時(shí)");return TRUE;AfxMessageBox("發(fā)送報(bào)文失敗!");TerminateProcess(GetCurrentProcess(),-1);return FALSE;/接收數(shù)據(jù)報(bào)BOOL CTracer二RecvData(char* icmpRcvBuf,int* presult)static int count=0;/總共6次出現(xiàn)接收超時(shí),判斷存在連接問題。if(count&g

34、t;5)AfxMessageBox("連接存在問題!");TerminateProcess(GetCurrentProcess(),-1);int fromlen=sizeof(SOCKADDR);*presult=SOCKET_ERROR;*presult=recvfrom(m_hSocket,icmpRcvBuf,MAX_PACKET,0,(SOCKADDR*) &m_addrFrom,&fromlen);time2=GetTickCount();if(*presult=SOCKET_ERROR)if(WSAGetLastError()=WSAETIME

35、DOUT)(CTraceRouteDlg*)m_pWnd)->InfoAdd ("接收超時(shí)!) count+;return TRUE;AfxMessageBox("接收數(shù)據(jù)報(bào)失敗!");TerminateProcess(GetCurrentProcess(),-1);return FALSE;/處理接收到的數(shù)據(jù)報(bào)BOOL CTracer二DecodeICMP(char* pBuffer,int bytes,int ttl)IPHEADER *ipHeader=NULL;ICMPHEADER *icmpHeader=NULL;unsigned short ip

36、HeaderLen;HOSTENT *ph=NULL;in_addr inaddr=m_addrFrom.sin_addr;ipHeader=(IPHEADER*)pBuffer;ipHeaderLen=20;if (bytes<ipHeaderLen+ICMP_MIN)AfxMessageBox("接收數(shù)據(jù)報(bào)長度不正確!");icmpHeader=(ICMPHEADER*)(pBuffer+20);switch (icmpHeader->i_type).目的站點(diǎn)的返回case ICMP_ECHOREPLY:ph=gethostbyaddr(const char

37、 *)&inaddr,AF_INET, sizeof(in_addr); if (ph != NULL)CString report; report.Format("%2d %s (%s)”,ttl,ph->h_name,inet_ntoa(inaddr); (CTraceRouteDlg*)m_pWnd)->InfoAdd(report);return TRUE;break;中途路由器的返回case ICMP_TIMEOUT:CString report;report.Format("%2d%s%2d ms",ttl,inet_ntoa(in

38、addr),(time2-time1);(CTraceRouteDlg*)m_pWnd)->InfoAdd(report);return FALSE;break;/錯(cuò)誤:主機(jī)不可達(dá)case ICMP_DESTUNREACH:CString report;report.Format("%2d %s主機(jī)不可達(dá)”,ttl,inet_ntoa(inaddr);(CTraceRouteDlg*)m_pWnd)->InfoAdd(report);return TRUE;break;/收到一個(gè)不是回應(yīng)的報(bào)文default:CString report;report.Format(&qu

39、ot;非回應(yīng)報(bào)文");(CTraceRouteDlg*)m_pWnd)->InfoAdd(report);return TRUE;return FALSE;void CTracer:SetWnd(CDialog *pWnd)/設(shè)置窗口指針 m_pWnd=pWnd;void CTracer:Trace(char *destAddress) int size=DEF_PACKET_SIZE+sizeof(ICMPHEADER);/轉(zhuǎn)換地址if (!FillAddress(destAddress) return ;分配必要的內(nèi)存空間icmpData=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PA CKET);icmpRcvBuf=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_ PAC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論