中南大學(xué)計算機網(wǎng)絡(luò)課程設(shè)計_第1頁
中南大學(xué)計算機網(wǎng)絡(luò)課程設(shè)計_第2頁
中南大學(xué)計算機網(wǎng)絡(luò)課程設(shè)計_第3頁
中南大學(xué)計算機網(wǎng)絡(luò)課程設(shè)計_第4頁
中南大學(xué)計算機網(wǎng)絡(luò)課程設(shè)計_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機網(wǎng)絡(luò)課程設(shè)計網(wǎng)絡(luò)嗅探器的設(shè)計與實現(xiàn) 學(xué)院: 信息科學(xué)與工程學(xué)院 專業(yè)班級: 指導(dǎo)老師: 張士庚 學(xué)號: 姓名: 目錄一、實驗要求2二、實驗?zāi)康?三、相關(guān)知識33.1、IP包格式:33.2、TCP包格式73.3、UDP數(shù)據(jù)包103.4、IP、TCP、 UDP的關(guān)系113.5、套接字12四、課程設(shè)計分析134.1 網(wǎng)卡設(shè)置134.2 使用套接字134.3 接收數(shù)據(jù)包144.4 定義IP頭部的數(shù)據(jù)結(jié)構(gòu)144.5 IP包的解析164.6 協(xié)議的定義164.7捕獲處理16五、實驗截圖17六、源程序代碼及分析17七、總結(jié)24八、課程設(shè)計參考資料25一、 實驗要求網(wǎng)絡(luò)嗅探器的設(shè)計與實現(xiàn): 基本要求捕獲

2、本網(wǎng)段的數(shù)據(jù)包,將報文結(jié)構(gòu)顯示出來.進一步要求進行數(shù)據(jù)包協(xié)議分析,可以按報頭進行統(tǒng)計,提取部分關(guān)鍵信息,如捕獲登陸信息,破解登陸密碼等.二、 實驗?zāi)康牧私夂驼莆詹东@網(wǎng)絡(luò)中ip包的方法,了解ip、tcp、udp等包的結(jié)構(gòu)??捎脀insock或winpcap來完成嗅探器的設(shè)計。 本次實驗用socket(套接字)在vc 6.0上進行編程。三、 相關(guān)知識3.1、IP包格式:互聯(lián)網(wǎng)絡(luò)層是TCP/IP協(xié)議參考模型中的關(guān)鍵部分.IP協(xié)議把傳輸層送來的消息組裝成IP數(shù)據(jù)包,并把IP數(shù)據(jù)包傳送給數(shù)據(jù)鏈層.IP協(xié)議在TCP/IP協(xié)議族中處于核心地位,IP協(xié)議制定了統(tǒng)一的IP數(shù)據(jù)包格式,以消除個通信子網(wǎng)中的差異,從

3、而為信息發(fā)送方和接收方提供了透明的傳輸通道.編制本程序前,首先要對IP包的格式有一定了解,圖1給出了IP協(xié)議的數(shù)據(jù)包格式.IP數(shù)據(jù)包的第一個字段是版本字段,其度是4位,表示所使用的IP協(xié)議的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要針對版本是IPV4的數(shù)據(jù)包的解析.報頭標(biāo)長字段為4位,它定義了以4B為一個單位的IP包的報文長度.報頭中除了選項字段和填充域字段外,其他各字段是定長的.因此,IP數(shù)據(jù)包的頭長度在2040B之間,是可變的.0 4 8 16 19 24 31版本首部長度區(qū)分服務(wù)總長度標(biāo)識標(biāo)志片偏移生存時間協(xié)議頭校驗和源IP地址目的地址

4、選項填充域數(shù)據(jù)部分圖1 IP數(shù)據(jù)包的格式服務(wù)類型字段共8位,用于指示路由器如何處理該數(shù)據(jù)包.該字段長度由4位服務(wù)類型(TOS)子域和3位優(yōu)先級子域組成,1位為保留位,該字段結(jié)構(gòu)如圖2所示. B7 b6 b5 b4 b3 b2 b1 b0優(yōu)先級DTRC0圖2 服務(wù)類型字段結(jié)構(gòu)優(yōu)先級共有8種,優(yōu)先級越高表明數(shù)據(jù)包越重要.表1中列出了各種優(yōu)先級所代表的意義.表一 優(yōu)先子域的說明位數(shù)(b7b6b5) 意義111 網(wǎng)絡(luò)控制110 網(wǎng)絡(luò)間控制101 重要(CRITIC/ECP)100 即時,優(yōu)先011 即時010 立刻001 優(yōu)先000 普通在4位服務(wù)類型子域中b4,b3,b2,b1分別表示D(延遲),T

5、(吞吐量),R(可靠性)與C(成本).表2列出了服務(wù)器類型自域的構(gòu)成.位數(shù)( b4b3b2b1)意義 1111 安全級最高 1000 延遲最小 0100 吞吐量最大 0001 金錢成本最小 0000 普通服務(wù)總長度字段為2B,它定義了以字節(jié)為單位的數(shù)據(jù)包的總長度.IP數(shù)據(jù)包的最大長度為65535B.標(biāo)識字段的長度為16位,用于識別IP數(shù)據(jù)包的編號.每批數(shù)據(jù)都要有一個標(biāo)識值,用于讓目的主機判斷新來的數(shù)據(jù)屬于哪個分組.報頭中的標(biāo)志字段如圖7-3所示.標(biāo)志字段共3位,最高位是0.禁止分片標(biāo)志DF(do not fragment)字段的值若為1,表示不能對數(shù)據(jù)包分片;若DF值為0,則表明可以分片.分片

6、標(biāo)志MF(more fragment)的值為1,表示接收到的不是最后一個分片;若MF值為0,表示接收到的是最后一個分片.片偏移字段共13位,說明分片在整個數(shù)據(jù)包中的相對位置.片偏移值是以8B為單位來記數(shù)的,因此選擇的分片長度應(yīng)該是8B的整數(shù)倍.生存時間(TTL)字段為8位,用來設(shè)置數(shù)據(jù)包在互聯(lián)網(wǎng)絡(luò)的傳輸過程的壽命,通常是用一個數(shù)據(jù)包可以經(jīng)過的最多的路由器跳步數(shù)來限定的.協(xié)議字段為8位,表示使用此IP數(shù)據(jù)包的高層協(xié)議類型,常用的協(xié)議號如表3所示.序號協(xié)議名稱序號協(xié)議名稱12468ICMPIGMPIP inIPTCPEGP17414689UDPIPV6RSVPOSPFA表3 典型的協(xié)議號頭校驗和字

7、段為16位,用于存放檢查報頭錯誤的校驗碼。檢驗的范圍是整個IP包的報頭。校驗和按如下方法計算:1)將頭校驗和的字段置為0。2)將報頭部分的所有數(shù)據(jù)以16位為單位進行累加,累加方式是求異或。3)將累加的結(jié)果取反碼,就是頭校驗和。 當(dāng)收到一個IP包時,要檢查報頭是否出錯,就把報頭中的所有數(shù)據(jù)以16位為單位進行累加,若累加的結(jié)果為0,則報文沒有出錯。 地址字段包括源地址和目的地址。源地址和目的地址的長度都是32位,分別表示發(fā)送數(shù)據(jù)包的源主機和目的主機的IP地址。 選項字段的長度范圍為040B,主要用于控制和測試。在使用選項字段的過程中,有可能出現(xiàn)報頭部分的長度不是32位的整數(shù)倍的情況。如果出現(xiàn)這種情

8、況,就需要通過填充位來湊齊。3.2、TCP包格式TCP (Transport Control Protocol)傳輸控制協(xié)議:TCP數(shù)據(jù)包的分組格式:源端口:標(biāo)識源端應(yīng)用進程。目的端口:標(biāo)識目的端應(yīng)用進程。序號:在SYN標(biāo)志未置位時,該字段指示了用戶數(shù)據(jù)區(qū)中第一個字節(jié)的序號;在SYN標(biāo)志置位時,該字段指示的是初始發(fā)送的序列號。確認號:用來確認本端TCP實體已經(jīng)接收到的數(shù)據(jù),其值表示期待對端發(fā)送的下一個字節(jié)的序號,實際上告訴對方,在這個序號減1以前的字節(jié)已正確接收。數(shù)據(jù)偏移:表示以32位字為單位的TCP分組頭的總長度,用于確定用戶數(shù)據(jù)區(qū)的起始位置。URG:緊急指針字段有效。ACK:確認好有效。P

9、SH:Push操作。TCP分組長度不定,為提高傳輸速率,往往要收集到足夠的數(shù)據(jù)后才發(fā)送。這種方式不適合實時性要求很高的應(yīng)用,因此,TCP提供“Push”操作,以強迫傳輸當(dāng)前的數(shù)據(jù),不必等待緩沖區(qū)滿才傳輸。RST:連接復(fù)位,重新連接。SYN:同步序號,該比特置位表示連接建立分組。FIN:字符串發(fā)送完畢,沒有其它數(shù)據(jù)需要發(fā)送,該比特置位表示連接確認分組。窗口:單位是字節(jié),指明該分組的發(fā)送端愿意接收的從確認字段中的值開始的字節(jié)數(shù)量。校驗和:對TCP分組的頭部和數(shù)據(jù)進行校驗。緊急指針:指出窗口中緊急數(shù)據(jù)的位置(從分組序號開始的正向位移,指向緊急數(shù)據(jù)的最后一個字節(jié)),這些緊急數(shù)據(jù)應(yīng)優(yōu)先于其它的數(shù)據(jù)進行傳

10、輸。任選項:用于處理一些特殊情況。目前被正式使用的選項字段可用于定義通信過程中的最大分組長度,只能在連接建立時使用。填充:用于保證任選項為32bit的整數(shù)倍。 TCP三次握手機制:第一次握手:客戶端發(fā)送一個SYN(包含有同步序列號的標(biāo)志位的數(shù)據(jù)段和通信請求)給服務(wù)器,然后等待服務(wù)器的回發(fā)確認信息第二次握手:服務(wù)器發(fā)送一個SYN-ACK給客戶端,確認已經(jīng)收到客戶端發(fā)來的信息第三次握手:客戶端接收到服務(wù)器發(fā)來的確認信息后,再回饋一個ACK給服務(wù)器,此時就可與服務(wù)器建立可靠的連接ACK:TCP數(shù)據(jù)包首部中的確認標(biāo)志,對已接收到的TCP報文進行確認。SYN:SYN是TCP/IP建立連接時使用的握手信號

11、。3.3、UDP數(shù)據(jù)包UDP(User Datagram Protocol)用戶數(shù)據(jù)報協(xié)議:UDP首部字段由4個部分組成,其中兩個是可選的。各16bit的來源端口和目的端口用來標(biāo)記發(fā)送和接受的應(yīng)用進程。因為UDP不需要應(yīng)答,所以來源端口是可選的,如果來源端口不用,那么置為零。在目的端口后面是長度固定的以字節(jié)為單位的長度域,用來指定UDP數(shù)據(jù)報包括數(shù)據(jù)部分的長度,長度最小值為8byte。首部剩下地16bit是用來對首部和數(shù)據(jù)部分一起做校驗和(Checksum)的,這部分是可選的,但在實際應(yīng)用中一般都使用這一功能。UDP數(shù)據(jù)報格式有首部和數(shù)據(jù)兩個部分。首部很簡單,共8字節(jié)。包括: 源端口(Sour

12、ce Port):2字節(jié),源端口號。 目的端口(Destination Port ):2字節(jié),目的端口號。 長度(Length):2字節(jié),UDP用戶數(shù)據(jù)報的總長度,以字節(jié)為單位。 檢驗和(Checksum):2字節(jié),用于校驗UDP數(shù)據(jù)報的數(shù)字段和包含UDP數(shù)據(jù)報首部的“偽首部”。其校驗方法同IP分組首部中的首部校驗和。與TCP包的不同之處:無需三次握手四次斷開,傳輸速度相對于TCP極快,不確定性,甚至可以不需要應(yīng)答,沒有TCP數(shù)據(jù)包的安全性,有丟包現(xiàn)象。3.4、IP、TCP、 UDP的關(guān)系TCP/IP協(xié)議棧主要分為四層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層,每層都有相應(yīng)的協(xié)議,如下圖所謂的協(xié)議就

13、是雙方進行數(shù)據(jù)傳輸?shù)囊环N格式。整個網(wǎng)絡(luò)中使用的協(xié)議有很多,所幸的是每一種協(xié)議都有RFC文檔。在這里只對IP、TCP、UDP協(xié)議頭做一個分析。IP協(xié)議是TCP/IP協(xié)議族中最為核心的協(xié)議。它提供不可靠、無連接的服務(wù),也即依賴其他層的協(xié)議進行差錯控制。在局域網(wǎng)環(huán)境,IP協(xié)議往往被封裝在以太網(wǎng)幀(見本章1.3節(jié))中傳送。而所有的TCP、UDP、ICMP、IGMP數(shù)據(jù)都被封裝在IP數(shù)據(jù)報中傳送。如圖2-3所示:TCP/IP報文封裝3.5、套接字在每個TCP、UDP數(shù)據(jù)段中都包含源端口和目標(biāo)端口字段。有時,我們把一個IP地址和一個端口號合稱為一個套接字(Socket),而一個套接字對(Socket pa

14、ir)可以唯一地確定互連網(wǎng)絡(luò)中每個TCP連接的雙方(客戶IP地址、客戶端口號、服務(wù)器IP地址、服務(wù)器端口號)。 常見協(xié)議和對應(yīng)的端口號需要注意的是,不同的應(yīng)用層協(xié)議可能基于不同的傳輸層協(xié)議,如FTP、TELNET、SMTP協(xié)議基于可靠的TCP協(xié)議。TFTP、SNMP、RIP基于不可靠的UDP協(xié)議。同時,有些應(yīng)用層協(xié)議占用了兩個不同的端口號,如FTP的20、21端口,SNMP的161、162端口。這些應(yīng)用層協(xié)議在不同的端口提供不同的功能。如FTP的21端口用來偵聽用戶的連接請求,而20端口用來傳送用戶的文件數(shù)據(jù)。再如,SNMP的161端口用于SNMP管理進程獲取SNMP代理的數(shù)據(jù),而162端口用

15、于SNMP代理主動向SNMP管理進程發(fā)送數(shù)據(jù)。還有一些協(xié)議使用了傳輸層的不同協(xié)議提供的服務(wù)。如DNS協(xié)議同時使用了TCP 53端口和UDP 53端口。DNS協(xié)議在UDP的53端口提供域名解析服務(wù),在TCP的53端口提供DNS區(qū)域文件傳輸服務(wù)。四、 課程設(shè)計分析4.1 網(wǎng)卡設(shè)置 為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對網(wǎng)卡進行編程,在這里使用套接字(socket)進行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在騅投遞地址并非自身地址之后將不引起響應(yīng),也就是說

16、應(yīng)用程序無法收取與自己無關(guān)的數(shù)據(jù)包。我們要想獲取網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設(shè)置為混雜模式。4.2 使用套接字 套接字分為三種,即流套接字(Stream socket)、數(shù)據(jù)報套接字(Datagram Socket)和原始套接字(Raw Socket)。要進行IP層數(shù)據(jù)包的接收和發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下: Socket sock;sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);本設(shè)計不用考慮超時情況。創(chuàng)建套接后,IP頭就會包含在接收數(shù)據(jù)包中。然后,我可以設(shè)置IP頭操作選項,調(diào)用setsockopt函數(shù)。其中flag設(shè)置為tr

17、ue,并設(shè)定IP-HDRINCL選項,表明用戶可以親自對IP頭進行處理。最后使用bind()函數(shù)將socket綁定到本地網(wǎng)卡上。綁定網(wǎng)卡后,需用WSAIoctl()函數(shù)把網(wǎng)卡設(shè)置為混雜模式,使網(wǎng)卡能夠接收所有的網(wǎng)絡(luò)數(shù)據(jù)。如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收的數(shù)據(jù)就拷貝到套接字中,因此,網(wǎng)卡就可以接收所有經(jīng)過的IP包。4.3 接收數(shù)據(jù)包 在程序中可使用recv()函數(shù)接收經(jīng)過的IP包。該函數(shù)有四個參數(shù),第一個參數(shù)接收操作所用的套接字描述符;第二個參數(shù)接收緩沖區(qū)的地址;第三個參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個參數(shù)是一個附加標(biāo)志,如果對所發(fā)送的數(shù)據(jù)沒特殊要求

18、,直接設(shè)為0。因為IP數(shù)據(jù)包的最大長度是65535B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來反復(fù)監(jiān)聽接收IP包,用recv()函數(shù)實現(xiàn)接收功能。4.4 定義IP頭部的數(shù)據(jù)結(jié)構(gòu)程序需要定義一個數(shù)據(jù)結(jié)構(gòu)表示IP頭部。其代碼如下:/* 定義IP頭部數(shù)據(jù)結(jié)構(gòu) */typedef struct _IP_HEADERunionBYTE Version; /版本(前4位)BYTE HdrLen; /報頭標(biāo)長(后四位),IP頭長度;BYTE ServiceType; /服務(wù)類型WORD TotalLen; /總長度WORD ID; /標(biāo)識unionWORD Flags;WORD Fr

19、agOff;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;IP_HEADER;4.5 IP包的解析 解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段(或子字段)時,可以利用IP-HEADER的成員直接獲取。要解析長度不是8位倍數(shù)的字段(或子字段)時,可以利用C語言中的移位以人、及與、或操作完成。4.6 協(xié)議的定義(包含相應(yīng)的頭文件#include #include):DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包

20、*/dwProtocol=IPPROTO_IP; /*協(xié)議類型為IP*/4.7捕獲處理1.加載 Winsock;2.創(chuàng)建一個接收原始IP包的socket連接;3.綁定到一個接口;4.進行WSAIoctl設(shè)置,接收所有的IP數(shù)據(jù)包。代碼如下:if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval),NULL, 0, &dwBytesRet, NULL, NULL) = SOCKET_ERROR)5.接著設(shè)定一個線程進行捕獲:(1)創(chuàng)建一個接收IP包的鏈表頭;(2)設(shè)置一個標(biāo)識,為真,則不斷進行IP包的捕獲;(3)建立一個新的結(jié)點,將捕獲的數(shù)

21、據(jù)包加入到該結(jié)點;(4)如果鏈表的長度達到指定的長度,創(chuàng)建一個線程對該鏈表的IP包進行解析;再設(shè)置一個在IP數(shù)據(jù)包鏈表不足給定的長度,而又中止IP捕獲時,對鏈表的處理;(5)為下一個IP包鏈表創(chuàng)建一個鏈表頭。五、 實驗截圖六、 源程序代碼及分析#include winsock2.h#include ws2tcpip.h#includeiostream.h#include stdio.h#includefstream.h#pragma comment(lib,ws2_32.lib)/ TCP數(shù)據(jù)包解析函數(shù)int DecodeTcpPack(char *);/ UDP數(shù)據(jù)包解析函數(shù)int Deco

22、deUdpPack(char *);/ ICMP數(shù)據(jù)包解析函數(shù)int DecodeIcmpPack(char *);/ 顯示數(shù)據(jù)包信息void ShowSubPackInfo(char *buf, BYTE Protocol);/*定義IP頭部數(shù)據(jù)結(jié)構(gòu)*/typedef struct IP_HEADER /union / / BYTE Version; /版本(前四位) / BYTE HdrLen; /報頭標(biāo)長(后四位),IP頭長度 / ; unsigned char h_verlen; / 版本和報頭標(biāo)長 BYTE ServiceType; /服務(wù)類型 WORD TotalLen; /總長度

23、 WORD ID; /標(biāo)識 union WORD Flags; /標(biāo)志 WORD FragOff; /片偏移 ; BYTE TimeToLive; /生存時間 BYTE Protocol; /協(xié)議 WORD HdrChksum; /首部檢驗和 DWORD SrcAddr; /源地址 DWORD DstAddr; /目的地址 BYTE Options; /選項 IP_HEADER;/ 定義TCP首部格式typedef struct _TCPHeader unsigned short th_sport; / 源端口號 unsigned short th_dport; / 目的端口號 unsigne

24、d int th_seq; / SEQ序號 unsigned int th_ack; / ACK序號 unsigned char th_lenres; / 首部長度 unsigned char th_flag; / 控制位 unsigned short th_win; / 窗口大小 unsigned short th_sum; / 校驗和 unsigned short th_urp; / 緊急指針 TCPHEADER;/ 定義UDP首部格式typedef struct _UDPHeaderunsigned short uh_sport; / 16位源端口unsigned short uh_dp

25、ort; / 16位目的端口unsigned short uh_len; / 16位長度unsigned short uh_sum; / 16位校驗和UDPHEADER;/ 定義ICMP首部格式typedef struct _ICMPHeaderBYTE i_type; / 8位類型BYTE i_code; / 8位代碼unsigned short i_cksum; / 16位校驗和unsigned short i_id; / 識別號unsigned short i_seq; / 報文序列號unsigned long timestamp; / 時間戳ICMPHEADER;/根據(jù)協(xié)議號獲取協(xié)議類

26、型char * getProtocol(BYTE Protocol) switch(Protocol) case 1:return ICMP; case 2:return IGMP;case 4: return IP in IP;case 6:return TCP;case 8:return EGP;case 17:return UDP; case 41:return IPv6;case 46:return RSVP;case 89:return OSPF;default:return UNKNOW;/* 解析IP數(shù)據(jù)包 */void ipparse(FILE* file,char* buff

27、er) IP_HEADER ip=*(IP_HEADER*)buffer; /fseek(file,0,SEEK_END); /ShowSubPackInfo(char *buf, int iProtocol); cout生存期 協(xié)議 源IP地址 目的IP地址 總長度 endl; cout(int)ip.TimeToLive getProtocol(ip.Protocol) inet_ntoa(*(in_addr*)&ip.SrcAddr)inet_ntoa(*(in_addr*)&ip.DstAddr) ip.TotalLenendl; int iIpLen = sizeof(unsigne

28、d long)*(ip.h_verlen & 0xf); ShowSubPackInfo(buffer+iIpLen, ip.Protocol); cout*endl; / 顯示子協(xié)議數(shù)據(jù)包信息void ShowSubPackInfo(char *buf, BYTE Protocol) /char Protocol=getProtocol(BYTE Protocol);switch(Protocol)case 6: / TCP數(shù)據(jù)包DecodeTcpPack(buf);break;case 17: / UDP數(shù)據(jù)包DecodeUdpPack(buf);break;case 1: / ICMP數(shù)

29、據(jù)包DecodeIcmpPack(buf);break;default:coutunknownendl;break; 下面程序是實現(xiàn)解析TCP數(shù)據(jù)包函數(shù)的部分代碼。參數(shù)TcpBuf是輸入的TCP首部和數(shù)據(jù)段的頭指針。程序流程是:首先將TcpBuf轉(zhuǎn)換成TCP首部格式。然后輸出TCP首部中的源端口號th_sport和目的端口號th_dport。最后采用循環(huán)與位的方法輸出TCP首部中的標(biāo)志位。/ TCP解包函數(shù)int DecodeTcpPack(char *TcpBuf)TCPHEADER *pTcpHeader;/char dataMAX_PACK_LEN;/int i;/ 轉(zhuǎn)換成TCP首部格式

30、pTcpHeader = (TCPHEADER*)TcpBuf;/ 輸出源端口和目的端口cout 源端口 目的端口endl th_sport)th_dport)endl; return true;下面程序是實現(xiàn)了解析UDP數(shù)據(jù)包的功能函數(shù)。參數(shù)UdpBuf表示輸入的UDP數(shù)據(jù)首部和數(shù)據(jù)段。程序流程是:首先將輸入?yún)?shù)UdpBuf 轉(zhuǎn)換成UDP首部格式,然后輸出UDP首部格式中的源端口號uh_sport,目的端口號uh_dport 和數(shù)據(jù)長度uh_len。最后和TCP解析函數(shù)一樣對關(guān)鍵字進行查找和輸出。/ UDP 解包函數(shù)int DecodeUdpPack(char *UdpBuf)UDPHEAD

31、ER *pUdpHeader;/char dataMAX_PACK_LEN;pUdpHeader = (UDPHEADER *)UdpBuf;/ 輸出端口cout 源端口 目的端口endl uh_sport)uh_dport)i_type,pIcmpHeader-i_code);printf( ID = %d SEQ = %dn,pIcmpHeader-i_id,pIcmpHeader-i_seq);return true;下面程序是實現(xiàn)嗅探功能的主函數(shù)部分代碼。程序流程是:調(diào)用WSAStartup函數(shù)初始化Winsock庫。然后調(diào)用socket函數(shù)創(chuàng)建原始套接字,并且調(diào)用gethostnam

32、e函數(shù)和gethostname函數(shù)獲得本機上IP地址,同時設(shè)置本地監(jiān)聽端口號為6000. 最后調(diào)用bind函數(shù)將本地地址結(jié)構(gòu)綁定在套接字上。然后調(diào)用WSAIoctl函數(shù)設(shè)置原始套接字接受所有的數(shù)據(jù)包,主要是將函數(shù)的第二個參數(shù)設(shè)置為SIO_RCVALL。開始無限循環(huán)調(diào)用recv函數(shù)接收Hub上所有的數(shù)據(jù)包。最后對接收到的數(shù)據(jù)包調(diào)用ipparse函數(shù)進行解析。/主程序開始main()int nRetCode = 0;WSADATA wsData;/* 啟動2.2版本的Socket,并將Socket版本信息保存到wsData中 */WSAStartup(MAKEWORD(2,2),&wsData); /初始化winsock,動態(tài)鏈接庫SOCKET sock;/* 創(chuàng)建原始套接字 */sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);BOOL flag=TRUE;/* 設(shè)置IP頭操作選項 */setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag);char hostName128;/* 獲取本地主機名 */gethostname

溫馨提示

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

評論

0/150

提交評論