網(wǎng)絡(luò)協(xié)議分析論文_第1頁(yè)
網(wǎng)絡(luò)協(xié)議分析論文_第2頁(yè)
網(wǎng)絡(luò)協(xié)議分析論文_第3頁(yè)
網(wǎng)絡(luò)協(xié)議分析論文_第4頁(yè)
網(wǎng)絡(luò)協(xié)議分析論文_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、2008屆學(xué)生畢業(yè)設(shè)計(jì)(論文)材料(二)學(xué) 生 畢 業(yè) 設(shè) 計(jì)(論 文)開 題 報(bào) 告 書課題名稱網(wǎng)絡(luò)協(xié)議分析姓 名學(xué) 號(hào)0406401*20院、系、部計(jì)算機(jī)科學(xué)與技術(shù)系專 業(yè)網(wǎng)絡(luò)工程指導(dǎo)教師2008年 5月 25 日材料清單1、畢業(yè)設(shè)計(jì)(論文)課題任務(wù)書2、畢業(yè)設(shè)計(jì)(論文)開題報(bào)告3、指導(dǎo)教師評(píng)閱表4、評(píng)閱教師評(píng)閱表5、答辯及最終成績(jī)?cè)u(píng)定表6、畢業(yè)設(shè)計(jì)說(shuō)明書7、附錄材料湖南城市學(xué)院2008屆畢業(yè)設(shè)計(jì)說(shuō)明書 網(wǎng)絡(luò)協(xié)議分析 院(系)、部: 計(jì)算機(jī)科學(xué)系 學(xué)生姓名: 指導(dǎo)教師: 職稱 講師 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 班 級(jí): 0406401班 完成時(shí)間: 2008年5月20日 摘 要 嗅探器就是

2、能夠捕獲網(wǎng)絡(luò)報(bào)文的設(shè)備。嗅探器的正當(dāng)用處在于分析網(wǎng)絡(luò)的流量,以便找出所關(guān)心的網(wǎng)絡(luò)中潛在的問(wèn)題。例如,假設(shè)網(wǎng)絡(luò)的某一段運(yùn)行得不是很好,報(bào)文的發(fā)送比較慢,而我們又不知道問(wèn)題出在什么地方,此時(shí)就可以用嗅探器來(lái)作出精確的問(wèn)題判斷。 嗅探器在功能和設(shè)計(jì)方面有很多不同。有些只能分析一種協(xié)議,而另一些可能能夠分析幾百種協(xié)議。Socket是Windows下網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)接口,它允許兩個(gè)或多個(gè)應(yīng)用程序在相同機(jī)器上,或者是通過(guò)網(wǎng)絡(luò)互相交流。關(guān)鍵詞 嗅探器;多線程;Socket;Visual C+ 6.0;MFCABSTRACTSniffer network is able to capture the text

3、on the equipment. Sniffer is the legitimate use of network traffic, in order to identify the concerns of potential problems in the network. For example, if a certain period of operation of the network is not a very good, to send the text more slowly, but we do not know that the problem in any place

4、at this time can be used sniffer to make accurate judgement of the issue. Sniffer in function and design of a lot of different. Some can only be of an agreement, while others may be able to analysis of hundreds of agreement. Socket network programming under Windows is the standard interface, which a

5、llows two or more applications in the same machine, or through the Internet exchange.Key words snifffer;multithreading;Socket;Visual C+ 6.0;MFC目 錄摘 要161 前言191.1 項(xiàng)目開發(fā)背景191.2 項(xiàng)目開發(fā)目標(biāo)191.3 幾個(gè)關(guān)鍵技術(shù)191.3.1 多線程編程191.3.2 Socket編程201.3.3 MFC編程202 開發(fā)工具Visual C+簡(jiǎn)介223 需求分析253.1 整體需求分析253.2 具體應(yīng)用分析253.2.1 網(wǎng)絡(luò)抓包及協(xié)議分

6、析需求分析253.2.2 本地網(wǎng)絡(luò)信息獲取需求分析253.2.3 端口掃描需求分析253.2.4 域名查詢需求分析263.3 可行性研究263.3.1 技術(shù)方面263.3.2 經(jīng)濟(jì)方面263.3.3 工作難點(diǎn)264.系統(tǒng)總體結(jié)構(gòu)設(shè)計(jì)274.1 軟件模塊結(jié)構(gòu)設(shè)計(jì)274.1.1 軟件工作模式圖274.1.2 軟件模塊結(jié)構(gòu)圖275.系統(tǒng)詳細(xì)設(shè)計(jì)305.1 嗅探器305.1.1 嗅探器簡(jiǎn)介315.1.2 界面設(shè)計(jì)305.1.3 程序流程圖305.1.4 主要代碼分析315.2 本地網(wǎng)絡(luò)信息瀏覽335.2.1 界面設(shè)計(jì)335.2.2 程序流程圖345.2.3 主要代碼分析345.3 端口掃描365.3.

7、1 界面設(shè)計(jì)365.3.2 程序流程圖375.3.3 主要代碼分析375.4 域名分析375.4.1 主要代碼分析376 系統(tǒng)的安裝與調(diào)試406.1 系統(tǒng)的安裝406.2 系統(tǒng)的調(diào)試417 結(jié)束語(yǔ)42參考文獻(xiàn)43致 謝44附 錄451 前言 1.1 項(xiàng)目開發(fā)背景 隨著計(jì)算機(jī)網(wǎng)絡(luò)的不斷普及,網(wǎng)絡(luò)管理的應(yīng)用需求越來(lái)越大,而嗅探器很早就在此領(lǐng)域發(fā)揮著重要的作用。嗅探器的種類繁多,有的是專門的某一個(gè)協(xié)議的分析器,有的則具有強(qiáng)大的功能,如非常著名的Ethereal,NetXRay和 Sniffer等。而這些大型的嗅探器需要昂貴的價(jià)格購(gòu)買,對(duì)于小型網(wǎng)絡(luò)則有“大材小用”之弊。所以,針對(duì)小型網(wǎng)絡(luò)的簡(jiǎn)易實(shí)用的嗅

8、探器應(yīng)運(yùn)而生。這里,我們的網(wǎng)絡(luò)協(xié)議分析工具就是應(yīng)用于小型局域網(wǎng)的管理,對(duì)其進(jìn)行基于數(shù)據(jù)抓包的監(jiān)控,包括本地局域網(wǎng)行為的實(shí)時(shí)查看,從而滿足小型局域網(wǎng)如學(xué)校機(jī)房,公司部門,政府單位等這樣規(guī)模的網(wǎng)絡(luò)的監(jiān)管及網(wǎng)絡(luò)信息獲取。1.2 項(xiàng)目開發(fā)目標(biāo)本項(xiàng)目開發(fā)的目標(biāo)是開發(fā)出實(shí)用于規(guī)模不大的局域網(wǎng)的監(jiān)控于管理。監(jiān)控就是實(shí)時(shí)對(duì)網(wǎng)絡(luò)的行為進(jìn)行監(jiān)視從而獲取采取控制行為所需的信息。管理是基于網(wǎng)絡(luò)信息的掌握而產(chǎn)生的,我們提供了本地網(wǎng)絡(luò)信息快速獲取的工具,域名查詢的實(shí)用工具,以觀察本地主機(jī)的行為,另外我們還提供了端口掃描的功能,使監(jiān)視能力更加強(qiáng)大??傊覀兊拈_發(fā)目標(biāo)是滿足小型網(wǎng)絡(luò)的信息獲取和行為監(jiān)管。1.3 幾個(gè)關(guān)鍵技術(shù)

9、1.3.1 多線程編程(1) 多線程處理的優(yōu)點(diǎn)同步應(yīng)用程序的開發(fā)比較容易,但由于需要在上一個(gè)任務(wù)完成后才能開始新的任務(wù),所以其效率通常比多線程應(yīng)用程序低。如果完成同步任務(wù)所用的時(shí)間比預(yù)計(jì)時(shí)間長(zhǎng),應(yīng)用程序可能會(huì)不響應(yīng)。多線程處理可以同時(shí)運(yùn)行多個(gè)過(guò)程。例如,文字處理器應(yīng)用程序在您處理文檔的同時(shí),可以檢查拼寫(作為單獨(dú)的任務(wù))。由于多線程應(yīng)用程序?qū)⒊绦騽澐殖瑟?dú)立的任務(wù),因此可以在以下方面顯著提高性能: ·多線程技術(shù)使程序的響應(yīng)速度更快,因?yàn)橛脩艚缑婵梢栽谶M(jìn)行其他工作的同時(shí)一直處于活動(dòng)狀態(tài)。 · 當(dāng)前沒(méi)有進(jìn)行處理的任務(wù)可以將處理器時(shí)間讓給其他任務(wù)。 · 占用大量處理時(shí)間的

10、任務(wù)可以定期將處理器時(shí)間讓給其他任務(wù)。 · 可以隨時(shí)停止任務(wù)。 · 可以分別設(shè)置各個(gè)任務(wù)的優(yōu)先級(jí)以優(yōu)化性能。 是否需要?jiǎng)?chuàng)建多線程應(yīng)用程序取決于多個(gè)因素。在以下情況下,最適合采用多線程處理: · 耗時(shí)或大量占用處理器的任務(wù)阻塞用戶界面操作。 · 各個(gè)任務(wù)必須等待外部資源(如遠(yuǎn)程文件或 Internet 連接)。 例如,用于跟蹤 Web 頁(yè)上的鏈接并下載滿足特定條件的文件的 Internet 應(yīng)用程序“robot”。這種應(yīng)用程序可以依次同步下載各個(gè)文件,也可以使用多線程同時(shí)下載多個(gè)文件。多線程方法比同步方法的效率高很多,因?yàn)榧词乖谀承┚€程中遠(yuǎn)程 Web 服務(wù)

11、器的響應(yīng)非常慢,也可以下載文件。(2) 多線程編程的難點(diǎn)當(dāng)多個(gè)線程之間有聯(lián)系的時(shí)候,線程之間的同步控制就會(huì)成為一個(gè)難點(diǎn),因?yàn)闆](méi)有人能預(yù)期線程的被執(zhí)行。在一個(gè)合作型多任務(wù)系統(tǒng)中,操作系統(tǒng)必須得到程序的允許才能夠改變線程。但是在強(qiáng)制性多任務(wù)系統(tǒng)中,控制權(quán)被調(diào)度程序強(qiáng)制轉(zhuǎn)移,也因此兩個(gè)線程之間的執(zhí)行次序變得不可預(yù)期。這不可預(yù)期性造成了所謂的race condition。由于資源是共享的,有時(shí)還會(huì)出現(xiàn)死鎖。1.3.2 Socket編程Socket是Windows下網(wǎng)絡(luò)編程的標(biāo)準(zhǔn)接口,它允許兩個(gè)或多個(gè)應(yīng)用程序在相同機(jī)器上,或者是通過(guò)網(wǎng)絡(luò)互相交流。這種Windows下的Socket簡(jiǎn)稱Winsock,Wi

12、nsock庫(kù)有兩個(gè)版本,Winsock1和Winsock2。現(xiàn)在開發(fā)網(wǎng)絡(luò)應(yīng)用程序都使用 Winsock2,需要在程序中包含頭文件Winsock2.h,它包含了絕大部分 socket函數(shù)和相關(guān)結(jié)構(gòu)類型的聲明和定義。同時(shí)要添加的還有到 WS2_32.lib庫(kù)的鏈接。包含必要的頭文件,設(shè)置好鏈接環(huán)境之后,便可進(jìn)行編碼工作了。(1)TCP/IP的socket提供下列三種類型套接字。流式套接字(SOCK_STREAM):提供了一個(gè)面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)地發(fā)送,且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無(wú)長(zhǎng)度限制。文件傳送協(xié)議(FTP)即使用流式套接字。

13、數(shù)據(jù)報(bào)式套接字(SOCK_DGRAM):提供了一個(gè)無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無(wú)錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。網(wǎng)絡(luò)文件系統(tǒng)(NFS)使用數(shù)據(jù)報(bào)式套接字。原始式套接字(SOCK_RAW):該接口允許對(duì)較低層協(xié)議,如IP、ICMP直接訪問(wèn)。常用于檢驗(yàn)新的協(xié)議實(shí)現(xiàn)或訪問(wèn)現(xiàn)有服務(wù)中配置的新設(shè)備。(2)為了更好地說(shuō)明套接字編程原理,下面給出幾個(gè)基本套接字系統(tǒng)調(diào)用說(shuō)明。創(chuàng)建套接字socket()    應(yīng)用程序在使用套接字前,首先必須擁有一個(gè)套接字,系統(tǒng)調(diào)用socket()向應(yīng)用程序提供創(chuàng)建套接字的手段,其調(diào)用格式如下:SOCKET

14、PASCAL FAR socket(int af, int type, int protocol);該調(diào)用要接收三個(gè)參數(shù):af、type、protocol。參數(shù)af指定通信發(fā)生的區(qū)域,UNIX系統(tǒng)支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中僅支持AF_INET,它是網(wǎng)際網(wǎng)區(qū)域。因此,地址族與協(xié)議族相同。參數(shù)type 描述要建立的套接字的類型。參數(shù)protocol說(shuō)明該套接字使用的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為0,使用默認(rèn)的連接模式。根據(jù)這三個(gè)參數(shù)建立一個(gè)套接字,并將相應(yīng)的資源分配給它,同時(shí)返回一個(gè)整型套接字號(hào)。指定本地地址bin

15、d()    當(dāng)一個(gè)套接字用socket()創(chuàng)建后,存在一個(gè)名字空間(地址族),但它沒(méi)有被命名。bind()將套接字地址(包括本地主機(jī)地址和本地端口地址)與所創(chuàng)建的套接字號(hào)聯(lián)系起來(lái),即將名字賦予套接字,以指定本地半相關(guān)。其調(diào)用格式如下:int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen);    參數(shù)s是由socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號(hào))。參數(shù)name 是賦給套接字s的本地地址(名字)

16、,其長(zhǎng)度可變,結(jié)構(gòu)隨通信域的不同而不同。namelen表明了name的長(zhǎng)度。    如果沒(méi)有錯(cuò)誤發(fā)生,bind()返回0。否則返回值SOCKET_ERROR。    地址在建立套接字通信過(guò)程中起著重要作用,作為一個(gè)網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)者對(duì)套接字地址結(jié)構(gòu)必須有明確認(rèn)識(shí)。例如,UNIX BSD有一組描述套接字地址的數(shù)據(jù)結(jié)構(gòu),其中使用TCP/IP協(xié)議的地址結(jié)構(gòu)為:struct sockaddr_in      short sin_family;  

17、0;              /*AF_INET*/      u_short sin_port;                 /*16位端口號(hào),網(wǎng)絡(luò)字節(jié)順序*/      struct in_addr

18、sin_addr;    /*32位IP地址,網(wǎng)絡(luò)字節(jié)順序*/      char sin_zero8;                 /*保留*/建立套接字連接connect()與accept()    這兩個(gè)系統(tǒng)調(diào)用用于完成一個(gè)完整相關(guān)的建立,其中connect()用于建立連接。無(wú)連接的套接字進(jìn)程也可以調(diào)用con

19、nect(),但這時(shí)在進(jìn)程之間沒(méi)有實(shí)際的報(bào)文交換,調(diào)用將從本地操作系統(tǒng)直接返回。這樣做的優(yōu)點(diǎn)是程序員不必為每一數(shù)據(jù)指定目的地址,而且如果收到的一個(gè)數(shù)據(jù)報(bào),其目的端口未與任何套接字建立“連接”,便能判斷該端口不可操作。而accept()用于使服務(wù)器等待來(lái)自某客戶進(jìn)程的實(shí)際連接。    connect()的調(diào)用格式如下:int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen);    參數(shù)s是欲建立連接的本地套接字描述

20、符。參數(shù)name指出說(shuō)明對(duì)方套接字地址結(jié)構(gòu)的指針。對(duì)方套接字地址長(zhǎng)度由namelen說(shuō)明。    如果沒(méi)有錯(cuò)誤發(fā)生,connect()返回0。否則返回值SOCKET_ERROR。在面向連接的協(xié)議中,該調(diào)用導(dǎo)致本地系統(tǒng)和外部系統(tǒng)之間連接實(shí)際建立。由于地址族總被包含在套接字地址結(jié)構(gòu)的前兩個(gè)字節(jié)中,并通過(guò)socket()調(diào)用與某個(gè)協(xié)議族相關(guān)。因此bind()和connect()無(wú)須協(xié)議作為參數(shù)。accept()的調(diào)用格式如下:SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR* addr, int FA

21、R* addrlen);    參數(shù)s為本地套接字描述符,在用做accept()調(diào)用的參數(shù)前應(yīng)該先調(diào)用過(guò)listen()。addr 指向客戶方套接字地址結(jié)構(gòu)的指針,用來(lái)接收連接實(shí)體的地址。addr的確切格式由套接字創(chuàng)建時(shí)建立的地址族決定。addrlen 為客戶方套接字地址的長(zhǎng)度(字節(jié)數(shù))。如果沒(méi)有錯(cuò)誤發(fā)生,accept()返回一個(gè)SOCKET類型的值,表示接收到的套接字的描述符。否則返回值INVALID_SOCKET。accept()用于面向連接服務(wù)器。參數(shù)addr和addrlen存放客戶方的地址信息。調(diào)用前,參數(shù)addr 指向一個(gè)初始值為空的地址結(jié)構(gòu),

22、而addrlen 的初始值為0;調(diào)用accept()后,服務(wù)器等待從編號(hào)為s的套接字上接受客戶連接請(qǐng)求,而連接請(qǐng)求是由客戶方的connect()調(diào)用發(fā)出的。當(dāng)有連接請(qǐng)求到達(dá)時(shí),accept()調(diào)用將請(qǐng)求連接隊(duì)列上的第一個(gè)客戶方套接字地址及長(zhǎng)度放入addr 和addrlen,并創(chuàng)建一個(gè)與s有相同特性的新套接字號(hào)。新的套接字可用于處理服務(wù)器并發(fā)請(qǐng)求。四個(gè)套接字系統(tǒng)調(diào)用,socket()、bind()、connect()、accept(),可以完成一個(gè)完全五元相關(guān)的建立。socket()指定五元組中的協(xié)議元,它的用法與是否為客戶或服務(wù)器、是否面向連接無(wú)關(guān)。bind()指定五元組中的本地二元,即本地主

23、機(jī)地址和端口號(hào),其用法與是否面向連接有關(guān):在服務(wù)器方,無(wú)論是否面向連接,均要調(diào)用bind();在客戶方,若采用面向連接,則可以不調(diào)用bind(),而通過(guò)connect()自動(dòng)完成。若采用無(wú)連接,客戶方必須使用bind()以獲得一個(gè)唯一的地址。    以上討論僅對(duì)客戶/服務(wù)器模式而言,實(shí)際上套接字的使用是非常靈活的,唯一需遵循的原則是進(jìn)程通信之前,必須建立完整的相關(guān)。監(jiān)聽連接listen()    此調(diào)用用于面向連接服務(wù)器,表明它愿意接收連接。listen()需在accept()之前調(diào)用,其調(diào)用格式如下:int PA

24、SCAL FAR listen(SOCKET s, int backlog);    參數(shù)s標(biāo)識(shí)一個(gè)本地已建立、尚未連接的套接字號(hào),服務(wù)器愿意從它上面接收請(qǐng)求。backlog表示請(qǐng)求連接隊(duì)列的最大長(zhǎng)度,用于限制排隊(duì)請(qǐng)求的個(gè)數(shù),目前允許的最大值為5。如果沒(méi)有錯(cuò)誤發(fā)生,listen()返回0。否則它返回SOCKET_ERROR。    listen()在執(zhí)行調(diào)用過(guò)程中可為沒(méi)有調(diào)用過(guò)bind()的套接字s完成所必須的連接,并建立長(zhǎng)度為backlog的請(qǐng)求連接隊(duì)列。 調(diào)用listen()是服務(wù)器接收一個(gè)連接請(qǐng)求的四個(gè)步驟中

25、的第三步。它在調(diào)用socket()分配一個(gè)流套接字,且調(diào)用bind()給s賦于一個(gè)名字之后調(diào)用,而且一定要在accept()之前調(diào)用。accept()調(diào)用為實(shí)現(xiàn)并發(fā)服務(wù)提供了極大方便,因?yàn)樗祷匾粋€(gè)新的套接字號(hào)數(shù)據(jù)傳輸send()與recv()    當(dāng)一個(gè)連接建立以后,就可以傳輸數(shù)據(jù)了。常用的系統(tǒng)調(diào)用有send()和recv()。send()調(diào)用用于在參數(shù)s指定的已連接的數(shù)據(jù)報(bào)或流套接字上發(fā)送輸出數(shù)據(jù),格式如下:int PASCAL FAR send(SOCKET s, const char FAR *buf, int len, int flags)

26、;參數(shù)s為已連接的本地套接字描述符。buf 指向存有發(fā)送數(shù)據(jù)的緩沖區(qū)的指針,其長(zhǎng)度由len 指定。flags 指定傳輸控制方式,如是否發(fā)送帶外數(shù)據(jù)等。如果沒(méi)有錯(cuò)誤發(fā)生,send()返回總共發(fā)送的字節(jié)數(shù)。否則它返回SOCKET_ERROR。recv()調(diào)用用于在參數(shù)s指定的已連接的數(shù)據(jù)報(bào)或流套接字上接收輸入數(shù)據(jù),格式如下:int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags);    參數(shù)s 為已連接的套接字描述符。buf指向接收輸入數(shù)據(jù)緩沖區(qū)的指針,其長(zhǎng)度由len 指定。flags

27、 指定傳輸控制方式,如是否接收帶外數(shù)據(jù)等。如果沒(méi)有錯(cuò)誤發(fā)生,recv()返回總共接收的字節(jié)數(shù)。如果連接被關(guān)閉,返回0。否則它返回SOCKET_ERROR。輸入/輸出多路復(fù)用select()    select()調(diào)用用來(lái)檢測(cè)一個(gè)或多個(gè)套接字的狀態(tài)。對(duì)每一個(gè)套接字來(lái)說(shuō),這個(gè)調(diào)用可以請(qǐng)求讀、寫或錯(cuò)誤狀態(tài)方面的信息。請(qǐng)求給定狀態(tài)的套接字集合由一個(gè)fd_set結(jié)構(gòu)指示。在返回時(shí),此結(jié)構(gòu)被更新,以反映那些滿足特定條件的套接字的子集,同時(shí), select()調(diào)用返回滿足條件的套接字的數(shù)目,其調(diào)用格式如下:int PASCAL FAR select(int nfds,

28、 fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout);    參數(shù)nfds指明被檢查的套接字描述符的值域,此變量一般被忽略。參數(shù)readfds指向要做讀檢測(cè)的套接字描述符集合的指針,調(diào)用者希望從中讀取數(shù)據(jù)。參數(shù)writefds 指向要做寫檢測(cè)的套接字描述符集合的指針。exceptfds指向要檢測(cè)是否出錯(cuò)的套接字描述符集合的指針。timeout指向select()函數(shù)等待的最大時(shí)間,如果設(shè)為NULL則

29、為阻塞操作。select()返回包含在fd_set結(jié)構(gòu)中已準(zhǔn)備好的套接字描述符的總數(shù)目,或者是發(fā)生錯(cuò)誤則返回SOCKET_ERROR。使用TCP創(chuàng)建網(wǎng)絡(luò)應(yīng)用程序稍微復(fù)雜一些,因?yàn)門CP是面向連接的協(xié)議,需要通信雙方首先建立一個(gè)連接,而UDP編程則相對(duì)簡(jiǎn)單些。Winsock的編程步驟是比較固定的,一般分以下幾個(gè)步驟:套接字的創(chuàng)建和關(guān)閉;綁定套接字到指定的IP地址和端口號(hào);設(shè)置套接字進(jìn)入監(jiān)聽狀態(tài);接受連接請(qǐng)求;收發(fā)數(shù)據(jù)。 MFC編程如果你曾經(jīng)使用過(guò)傳統(tǒng)的windows編程方法開發(fā)應(yīng)用程序,你會(huì)深刻地體會(huì)到,即使是開發(fā)一個(gè)簡(jiǎn)單的windows應(yīng)用程序也需要對(duì)windows的編程原理有很深刻的認(rèn)識(shí),同

30、時(shí)也要手工編寫很多的代碼。因?yàn)槌绦虻某鲥e(cuò)率幾乎是隨著代碼長(zhǎng)度的增加呈幾何級(jí)數(shù)增長(zhǎng)的,這就使得調(diào)試程序變得非常困難。所以傳統(tǒng)的windows編程是需要極大的耐心和豐富的編程經(jīng)驗(yàn)的。近幾年來(lái),面向?qū)ο蠹夹g(shù)無(wú)論是在理論還是實(shí)踐上都在飛速地發(fā)展。面向?qū)ο蠹夹g(shù)中最重要的就是“對(duì)象”的概念,它把現(xiàn)實(shí)世界中的氣球、自行車等客觀實(shí)體抽象成程序中的“對(duì)象”。這種“對(duì)象”具有一定的屬性和方法,這里的屬性指對(duì)象本身的各種特性參數(shù)。如氣球的體積,自行車的長(zhǎng)度等,而方法是指對(duì)象本身所能執(zhí)行的功能,如氣球能飛,自行車能滾動(dòng)等。一個(gè)具體的對(duì)象可以有許多的屬性和方法,面向?qū)ο蠹夹g(shù)的重要特點(diǎn)就是對(duì)象的封裝性,對(duì)于外界而言,并不

31、需要知道對(duì)象有哪些屬性,也不需要知道對(duì)象本身的方法是如何實(shí)現(xiàn)的,而只需要調(diào)用對(duì)象所提供的方法來(lái)完成特定的功能。從這里我們可以看出,當(dāng)把面向?qū)ο蠹夹g(shù)應(yīng)用到程序設(shè)計(jì)中時(shí),程序員只是在編寫對(duì)象方法時(shí)才需要關(guān)心對(duì)象本身的細(xì)節(jié)問(wèn)題,大部分的時(shí)間是放在對(duì)對(duì)象的方法的調(diào)用上,組織這些對(duì)象進(jìn)行協(xié)同工作。MFC的英文全稱是Microsoft Fundation Classes,即微軟的基本類庫(kù),MFC的本質(zhì)就是一個(gè)包含了許多微軟公司已經(jīng)定義好的對(duì)象的類庫(kù),我們知道,雖然我們要編寫的程序在功能上是千差萬(wàn)別的,但從本質(zhì)上來(lái)講,都可以化歸為用戶界面的設(shè)計(jì),對(duì)文件的操作,多媒體的使用,數(shù)據(jù)庫(kù)的訪問(wèn)等等一些最主要的方面。

32、這一點(diǎn)正是微軟提供MFC類庫(kù)最重要的原因,在這個(gè)類庫(kù)中包含了一百多個(gè)程序開發(fā)過(guò)程中最常用到的對(duì)象。在進(jìn)行程序設(shè)計(jì)的時(shí)候,如果類庫(kù)中的某個(gè)對(duì)象能完成所需要的功能,這時(shí)我們只要簡(jiǎn)單地調(diào)用已有對(duì)象的方法就可以了。我們還可以利用面向?qū)ο蠹夹g(shù)中很重要的“繼承”方法從類庫(kù)中的已有對(duì)象派生出我們自己的對(duì)象,這時(shí)派生出來(lái)的對(duì)象除了具有類庫(kù)中的對(duì)象的特性和功能之外,還可以由我們自己根據(jù)需要加上所需的特性和方法,產(chǎn)生一個(gè)更專門的,功能更為強(qiáng)大的對(duì)象。當(dāng)然,你也可以在程序中創(chuàng)建全新的對(duì)象,并根據(jù)需要不斷完善對(duì)象的功能。正是由于MFC編程方法充分利用了面向?qū)ο蠹夹g(shù)的優(yōu)點(diǎn),它使得我們編程時(shí)極少需要關(guān)心對(duì)象方法的實(shí)現(xiàn)細(xì)節(jié)

33、,同時(shí)類庫(kù)中的各種對(duì)象的強(qiáng)大功能足以完成我們程序中的絕大部分所需功能,這使得應(yīng)用程序中程序員所需要編寫的代碼大為減少,有力地保證了程序的良好的可調(diào)試性。最后要指出的是MFC類庫(kù)在提供的對(duì)象的各種屬性和方法都是經(jīng)過(guò)謹(jǐn)慎的編寫和嚴(yán)格的測(cè)試,可靠性很高,這就保證了使用MFC類庫(kù)不會(huì)影響程序的可靠性和正確性。2 開發(fā)工具Visual C+簡(jiǎn)介Visual C+是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出Visual C+1.0后,隨著其新版本的不斷問(wèn)世,Visual C+已成為專業(yè)程序員進(jìn)行軟件開發(fā)的首選工具。 雖然微軟公司推出了Visual C+.NET(Visual

34、C+7.0),但它的應(yīng)用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實(shí)際中,更多的是以Visual C+6.0為平臺(tái)。 Visual C+6.0不僅是一個(gè)C+編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)。Visual C+6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具。 這些組件通過(guò)一個(gè)名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境。 Visual C+它

35、大概可以分成三個(gè)主要的部分:(1) Developer Studio,這是一個(gè)集成開發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標(biāo)題赫然寫著“Microsoft Visual C+”,所以很多人理所當(dāng)然的認(rèn)為,那就是Visual C+了。其實(shí)不然,雖然Developer Studio提供了一個(gè)很好的編輯器和很多Wizard,但實(shí)際上它沒(méi)有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會(huì)介紹。我們也知道,Developer Studio并不是專門用于VC的,它也同樣用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Stud

36、io當(dāng)成Visual C+, 它充其量只是Visual C+的一個(gè)殼子而已。這一點(diǎn)請(qǐng)切記!(2) MFC。從理論上來(lái)講,MFC也不是專用于Visual C+,Borland C+,C+Builder和Symantec C+同樣可以處理MFC。同時(shí),用Visual C+編寫代碼也并不意味著一定要用MFC,只要愿意,用Visual C+來(lái)編寫SDK程序,或者使用STL,ATL,一樣沒(méi)有限制。不過(guò),Visual C+本來(lái)就是為MFC打造的,Visual C+中的許多特征和語(yǔ)言擴(kuò)展也是為MFC而設(shè)計(jì)的,所以用Visual C+而不用MFC就等于拋棄了Visual C+中很大的一部分功能。但是,Visu

37、al C+也不等于MFC。(3) Platform SDK。這才是Visual C+和整個(gè)Visual Studio的精華和靈魂,雖然我們很少能直接接觸到它。大致說(shuō)來(lái),Platform SDK是以Microsoft C/C+編譯器為核心(不是Visual C+,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說(shuō)到Developer Studio沒(méi)有編譯程序的功能,那么這項(xiàng)工作是由誰(shuí)來(lái)完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成Visual Studio的基石。3 需求分析3.1 整體需求分析 小型局域網(wǎng)的管理不可能使用Ethereal,Net

38、XRay和 Sniffer等大型嗅探器,但又需要有經(jīng)濟(jì)實(shí)用的網(wǎng)絡(luò)數(shù)據(jù)抓包及協(xié)議分析工具,這里,不僅要求此工具具有一般協(xié)議分析器的通用功能,即對(duì)網(wǎng)絡(luò)中的所有主機(jī)的嗅探和行為分析,而且要配備一些實(shí)用的網(wǎng)絡(luò)信息查詢輔助工具,包括內(nèi)網(wǎng)和外網(wǎng)的一些信息,使之有所聯(lián)系。3.2 具體應(yīng)用分析3.2.1 網(wǎng)絡(luò)抓包及協(xié)議分析需求分析 如何對(duì)網(wǎng)絡(luò)中的所有行為做到實(shí)時(shí)監(jiān)控?這就需要對(duì)網(wǎng)絡(luò)中的所有數(shù)據(jù)包都能獲取繼而進(jìn)行協(xié)議分析,這樣才能獲取有用的信息。所以在本軟件中此模塊為主題功能,即主要模塊,擔(dān)任對(duì)總體把握和實(shí)時(shí)監(jiān)控的功能。3.2.2 本地網(wǎng)絡(luò)信息獲取需求分析 對(duì)于一個(gè)網(wǎng)管,獲取本地網(wǎng)絡(luò)的全部或一個(gè)地址段的一組包括

39、IP地址,主機(jī)名,物理地址,用戶信息及其所在工作組的信息是非常有用的,甚至是必須的?;谶@種需求,我們提供了這樣的工具,即本模塊所實(shí)現(xiàn)的具有獲取本地網(wǎng)絡(luò)信息功能的工具。3.2.3 端口掃描需求分析 網(wǎng)絡(luò)通信的最終地址就不僅僅是主機(jī)地址了,還包括可以描述進(jìn)程的某種標(biāo)識(shí)符。為此,TCP/IP協(xié)議提出了協(xié)議端口(protocol port,簡(jiǎn)稱端口)的概念,用于標(biāo)識(shí)通信的進(jìn)程。網(wǎng)絡(luò)通信的最終地址就不僅僅是主機(jī)地址了,還包括可以描述進(jìn)程的某種標(biāo)識(shí)符。為此,TCP/IP協(xié)議提出了協(xié)議端口的概念,用于標(biāo)識(shí)通信的進(jìn)程。 所以,掃描端口的信息對(duì)網(wǎng)絡(luò)行為的分析有著至關(guān)重要的作用。這里我們?cè)谥髂K的基礎(chǔ)上提供了功

40、能更強(qiáng)大的端口掃描工具,具有主機(jī)選擇和端口號(hào)指定掃描功能。為網(wǎng)管提供更有針對(duì)性的掃描工具。3.2.4 域名查詢需求分析 DNS是網(wǎng)絡(luò)信息更直觀,這里也是出于這種考慮,提供給使用者一個(gè)輔助查詢工具,相信它將對(duì)使用者有所助益。主要是考慮到軟件完善性而加入的小模塊。3.3 可行性研究3.3.1 技術(shù)方面Visual C+ 6.0提供了功能強(qiáng)大的開發(fā)平臺(tái),使得程序界面的實(shí)現(xiàn)簡(jiǎn)單、快速、標(biāo)準(zhǔn)。Winsock為Windows網(wǎng)絡(luò)編程提供了豐富的接口技術(shù),結(jié)合多線程技術(shù),使得此處的基于TCP/IP網(wǎng)絡(luò)編程具有良好的健壯性和強(qiáng)大的可擴(kuò)展性。本軟件最后所生成的.EXE可執(zhí)行文件具有很好的可移植性。3.3.2 經(jīng)

41、濟(jì)方面開發(fā)本軟件我們只需要至少兩臺(tái)可以互相通信(在一個(gè)網(wǎng)絡(luò)中)的計(jì)算機(jī),而這樣的開發(fā)條件是很容易滿足的,所以本軟件的開發(fā)成本是非常低的。具有良好的經(jīng)濟(jì)性。3.3.3 工作難點(diǎn)開發(fā)本軟件主要要研究和解決的問(wèn)題有:(1) 多線程編程使用多線程編程是為了使程序的響應(yīng)速度更快,在使用時(shí)應(yīng)注意避免出現(xiàn)資源競(jìng)爭(zhēng)和死鎖的出現(xiàn)。(2) Socket編程Socket編程主要提供標(biāo)準(zhǔn)的網(wǎng)絡(luò)編程接口,使得兩個(gè)或多個(gè)應(yīng)用程序在同一臺(tái)電腦上,或者是通過(guò)網(wǎng)絡(luò)相互交流。使得本軟件中基于IP協(xié)議的TCP、 UTP、ICMP和ARP等協(xié)議的編程得以實(shí)現(xiàn)。 界面設(shè)計(jì)界面中各個(gè)控件的布局以及消息響應(yīng)函數(shù)的編寫是貫穿整個(gè)工程的一項(xiàng)重

42、要的工作。它也在整個(gè)工程設(shè)計(jì)的過(guò)程中耗費(fèi)了我們很多經(jīng)歷。4.系統(tǒng)總體結(jié)構(gòu)設(shè)計(jì)4.1 軟件模塊結(jié)構(gòu)設(shè)計(jì)4.1.1 軟件工作模式圖 安裝本軟件的主機(jī)(服務(wù)器) (客戶機(jī))圖4.1 工作模式圖4.1.2 軟件模塊結(jié)構(gòu)圖數(shù)據(jù)抓包及協(xié)議分析(主程序sniffer)端口掃描本地計(jì)算機(jī)信息瀏覽域名查詢圖4.2 軟件結(jié)構(gòu)圖4.1.3 軟件設(shè)計(jì)結(jié)構(gòu)圖Socket(),建立流式套接字,返回套接字句柄sListen。Bind(),關(guān)聯(lián)一個(gè)本地地址到套接字sListen。Listen(),設(shè)置backlog值,進(jìn)入監(jiān)聽狀態(tài)。Socket(),建立流式套接字s。建立連接,accept函數(shù)返回,得到新的套接字,如sCli

43、ent。Recv()/send(),在套接字sClient上收發(fā)數(shù)據(jù),直到完成交換。Closesocket(),關(guān)閉監(jiān)聽套接字sListen,服務(wù)結(jié)束。Closesocket(),關(guān)閉套接字s,結(jié)束TCP對(duì)話。Accept(),等待接受客戶連接請(qǐng)求。Closesocket(),關(guān)閉套接字sClient。Connect(),將套接字s與服務(wù)器連接。Recv()/send(),在套接字上收發(fā)數(shù)據(jù),直到完成交換。服務(wù)器方客戶方5.系統(tǒng)詳細(xì)設(shè)計(jì)5.1 嗅探器5.1.1 嗅探器簡(jiǎn)介嗅探器(snifffer)就是能夠捕獲網(wǎng)絡(luò)報(bào)文的設(shè)備。嗅探器的正當(dāng)用處在于分析網(wǎng)絡(luò)的流量,以便找出所關(guān)心的網(wǎng)絡(luò)中潛在的問(wèn)題。

44、例如,假設(shè)網(wǎng)絡(luò)的某一段運(yùn)行得不是很好,報(bào)文的發(fā)送比較慢,而我們又不知道問(wèn)題出在什么地方,此時(shí)就可以用嗅探器來(lái)作出精確的問(wèn)題判斷。 嗅探器在功能和設(shè)計(jì)方面有很多不同。有些只能分析一種協(xié)議,而另一些可能能夠分析幾百種協(xié)議。一般情況下,大多數(shù)的嗅探器至少能夠分析下面的協(xié)議: 標(biāo)準(zhǔn)以太網(wǎng) TCP/IP IPX DECNet 嗅探器通常是軟硬件的結(jié)合。專用的嗅探器價(jià)格非常昂貴。另一方面,免費(fèi)的嗅探器雖然不需要花什么錢,但得不到什么支持。 嗅探器與一般的鍵盤捕獲程序不同。鍵盤捕獲程序捕獲在終端上輸入的鍵值,而嗅探器則捕獲真實(shí)的網(wǎng)絡(luò)報(bào)文。嗅探器通過(guò)將其置身于網(wǎng)絡(luò)接口來(lái)達(dá)到這個(gè)目的例如將以太網(wǎng)卡設(shè)置成雜收模式

45、。(為了理解雜收模式是怎么回事,先解釋局域網(wǎng)是怎么工作的)。 數(shù)據(jù)在網(wǎng)絡(luò)上是以很小的稱為幀(Ftame)的單位傳輸?shù)膸珊脦撞糠纸M成,不同的部分執(zhí)行不同的功能。(例如,以太網(wǎng)的前12個(gè)字節(jié)存放的是源和目的的地址,這些位告訴網(wǎng)絡(luò):數(shù)據(jù)的來(lái)源和去處。以太網(wǎng)幀的其他部分存放實(shí)際的用戶數(shù)據(jù)、TCP/IP的報(bào)文頭或IPX報(bào)文頭等等)。 幀通過(guò)特定的稱為網(wǎng)絡(luò)驅(qū)動(dòng)程序的軟件進(jìn)行成型,然后通過(guò)網(wǎng)卡發(fā)送到網(wǎng)線上。通過(guò)網(wǎng)線到達(dá)它們的目的機(jī)器,在目的機(jī)器的一端執(zhí)行相反的過(guò)程。接收端機(jī)器的以太網(wǎng)卡捕獲到這些幀,并告訴操作系統(tǒng)幀的到達(dá),然后對(duì)其進(jìn)行存儲(chǔ)。就是在這個(gè)傳輸和接收的過(guò)程中,嗅探器會(huì)造成安全方面的問(wèn)題。 每一個(gè)

46、在LAN上的工作站都有其硬件地址。這些地址唯一地表示著網(wǎng)絡(luò)上的機(jī)器(這一點(diǎn)于Internet地址系統(tǒng)比較相似)。當(dāng)用戶發(fā)送一個(gè)報(bào)文時(shí),這些報(bào)文就會(huì)發(fā)送到LAN上所有可用的機(jī)器。 在一般情況下,網(wǎng)絡(luò)上所有的機(jī)器都可以“聽”到通過(guò)的流量,但對(duì)不屬于自己的報(bào)文則不予響應(yīng)(換句話說(shuō),工作站A不會(huì)捕獲屬于工作站B的數(shù)據(jù),而是簡(jiǎn)單的忽略這些數(shù)據(jù))。 如果某在工作站的網(wǎng)絡(luò)接口處于雜收模式,那么它就可以捕獲網(wǎng)絡(luò)上所有的報(bào)文和幀,如果一個(gè)工作站被配置成這樣的方式,它(包括其軟件)就是一個(gè)嗅探器。 嗅探器可能造成的危害: 嗅探器能夠捕獲口令 能夠捕獲專用的或者機(jī)密的信息 可以用來(lái)危害網(wǎng)絡(luò)鄰居的安全,或者用來(lái)獲取更

47、高級(jí)別的訪問(wèn)權(quán)限 事實(shí)上,如果你在網(wǎng)絡(luò)上存在非授權(quán)的嗅探器就以為著你的系統(tǒng)已經(jīng)暴露在別人面前了。 一般我們只嗅探每個(gè)報(bào)文的前200到300個(gè)字節(jié)。用戶名和口令都包含在這一部分中,這是我們關(guān)心的真正部分。工人,也可以嗅探給定接口上的所有報(bào)文,如果有足夠的空間進(jìn)行存儲(chǔ),有足夠的那里進(jìn)行處理的話,將會(huì)發(fā)現(xiàn)另一些非常有趣的東西。 簡(jiǎn)單的放置一個(gè)嗅探器賓將其放到隨便什么地方將不會(huì)起到什么作用。將嗅探器放置于被攻擊機(jī)器或網(wǎng)絡(luò)附近,這樣將捕獲到很多口令,還有一個(gè)比較好的方法就是放在網(wǎng)關(guān)上。如果這樣的話就能捕獲網(wǎng)絡(luò)和其他網(wǎng)絡(luò)進(jìn)行身份鑒別的過(guò)程。這樣的方式將成倍地增加我們能夠攻擊的范圍。 關(guān)于怎么抵御嗅探器的攻

48、擊,有三種方法可能會(huì)有所作用: 檢測(cè)和消滅嗅探器 將數(shù)據(jù)隱藏,使嗅探器無(wú)法發(fā)現(xiàn)。 會(huì)話加密 5.1.2 界面設(shè)計(jì)5.1.3 程序流程圖5.1.4 主要代碼分析 在IpMonDlg.h中,首先定義一些協(xié)議相關(guān)的結(jié)構(gòu)和宏。另外還會(huì)申明一個(gè)線程函數(shù)為友員函數(shù),它負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)數(shù)據(jù)報(bào)。代碼及相關(guān)注釋如下:/定義協(xié)議的名稱結(jié)構(gòu)typedef struct _PROTN2T int proto ;char *pprototext ;PROTN2T ; / 協(xié)議數(shù)#define PROTO_NUM 11 /IP頭結(jié)構(gòu)typedef struct _IPHEADER unsigned char header_l

49、en:4; unsigned char version:4; unsigned char tos; /服務(wù)類型 unsigned short total_len; / 數(shù)據(jù)報(bào)大小 unsigned short ident; / 數(shù)據(jù)報(bào)標(biāo)識(shí) unsigned short flags; unsigned char ttl; unsigned char proto; / 協(xié)議( IP , TCP, UDP 等) unsigned short checksum; unsigned int sourceIP; unsigned int destIP;IPHEADER;這里附加IP包頭部結(jié)構(gòu)圖:16位 1

50、6位 版本 IHL 服務(wù)類型 總長(zhǎng) 標(biāo)識(shí) 標(biāo)志 分段偏移 生命期 協(xié)議 頭校驗(yàn)和 源地址 目的地址 選項(xiàng)(0或更多) #define UDP_HEAD_LEN 8/* UDP 頭部長(zhǎng)度 */#define PSEUDO_HEAD_LEN 12#define ICMP_HEAD_LEN 4/* ICMP頭部長(zhǎng)度 */TCP包頭部結(jié)構(gòu)struct TCPPacketHead WORD SourPort;WORD DestPort;DWORD SeqNo;DWORD AckNo;BYTE HLen;BYTE Flag;WORD WndSize;WORD ChkSum;WORD UrgPtr;這里附加

51、TCP包頭部結(jié)構(gòu)圖:16位 16位 源端口 目的端口 順序號(hào) 確認(rèn)號(hào) TCP頭長(zhǎng) (保留)7位 URG ACK PSH RST SYN FIN 窗口大小 校驗(yàn)和 緊急指針 可選項(xiàng)(0或更多的32位字) 數(shù)據(jù)(可選項(xiàng)) /ICMP包頭部結(jié)構(gòu)struct ICMPPacketHead BYTE Type;BYTE Code;WORD ChkSum;/UDP包頭部結(jié)構(gòu)struct UDPPacketHead WORD SourPort;WORD DestPort;WORD Len;WORD ChkSum;這里附加UDP包頭部結(jié)構(gòu)圖:16位 16位 源端口 目的端口 UDP長(zhǎng)度 UDP校驗(yàn)和 /監(jiān)聽線

52、程函數(shù)friend UINT threadFunc ( LPVOID p ) ;為程序流程的清晰起見,去掉了錯(cuò)誤檢查等保護(hù)性代碼。主要代碼實(shí)現(xiàn)清單為:/ 檢查 Winsock 版本號(hào),WSAData為WSADATA結(jié)構(gòu)對(duì)象 WSAStartup(MAKEWORD(2, 2), &WSAData); / 創(chuàng)建原始套接字 sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); / 設(shè)置IP頭操作選項(xiàng),其中flag 設(shè)置為ture,親自對(duì)IP頭進(jìn)行處理 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&am

53、p;flag, sizeof(flag); / 獲取本機(jī)名 gethostname(char*)LocalName, sizeof(LocalName)-1); / 獲取本地 IP 地址 pHost = gethostbyname(char*)LocalName); / 填充SOCKADDR_IN結(jié)構(gòu) addr_in.sin_addr = *(in_addr *)pHost-> h_addr_list0; /IP addr_in.sin_family = AF_INET; addr_in.sin_port = htons(57274); / 把原始套接字sock 綁定到本地網(wǎng)卡地址上 b

54、ind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in); / dwValue為輸入輸出參數(shù),為1時(shí)執(zhí)行,0時(shí)取消 DWORD dwValue = 1; / 設(shè)置 SOCK_RAW 為SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL / 的定義為: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) ioctlsocket(sock, SIO_RCVALL, &dwValue); 前面的工作基本上都是對(duì)原始套接字進(jìn)行設(shè)置,在將原始套接字設(shè)置完畢,使其能按預(yù)期目的工作時(shí),就可以通過(guò)recv()函

55、數(shù)從網(wǎng)卡接收數(shù)據(jù)了,接收到的原始數(shù)據(jù)包存放在緩存RecvBuf中,緩沖區(qū)長(zhǎng)度BUFFER_SIZE定義為65535。然后就可以根據(jù)前面對(duì)IP數(shù)據(jù)段頭、TCP數(shù)據(jù)段頭的結(jié)構(gòu)描述而對(duì)捕獲的數(shù)據(jù)包進(jìn)行分析: while (true) / 接收原始數(shù)據(jù)包信息 int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0); if (ret > 0) / 對(duì)數(shù)據(jù)包進(jìn)行分析,并輸出分析結(jié)果 ip = *(IP*)RecvBuf; tcp = *(TCP*)(RecvBuf + ip.HdrLen); TRACE("協(xié)議: %srn",GetProtoc

56、olTxt(ip.Protocol); TRACE("IP源地址: %srn",inet_ntoa(*(in_addr*)&ip.SrcAddr); TRACE("IP目標(biāo)地址: %srn",inet_ntoa(*(in_addr*)&ip.DstAddr); TRACE("TCP源端口號(hào): %drn",tcp.SrcPort); TRACE("TCP目標(biāo)端口號(hào):%drn",tcp.DstPort); TRACE("數(shù)據(jù)包長(zhǎng)度: %drnrnrn",ntohs(ip.TotalLen); 其中,在進(jìn)行協(xié)議分析時(shí),使用了GetProtocolTxt()函數(shù),該函數(shù)負(fù)責(zé)將IP包中的協(xié)議(數(shù)字標(biāo)識(shí)的)轉(zhuǎn)化為文字輸出,該函數(shù)實(shí)現(xiàn)如下: #define PROTOCOL_STRING_ICMP_TXT "ICMP

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論