版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 計算機(jī)網(wǎng)絡(luò)工程課程設(shè)計報告</p><p> 題 目: 解析IP數(shù)據(jù)包 </p><p> 學(xué)生姓名: </p><p> 學(xué) 號: </p><p> 專業(yè)班級:
2、 </p><p> 同組姓名: </p><p> 指導(dǎo)教師: </p><p> 設(shè)計時間: 2013年下學(xué)期第16周 </p><p><b> 目錄</
3、b></p><p><b> 目錄2</b></p><p> 1、課程設(shè)計目的2</p><p> 2、課程設(shè)計要求2</p><p><b> 3、相關(guān)知識2</b></p><p> 4、課程設(shè)計分析6</p><p>
4、; 4.1 網(wǎng)卡設(shè)置6</p><p> 4.2 使用套接字7</p><p> 4.2.2 接收數(shù)據(jù)包7</p><p> 4.3 定義IP頭部的數(shù)據(jù)結(jié)構(gòu)8</p><p> 4.4 IP包的解析9</p><p> 4.5 協(xié)議的定義9</p><p><b&g
5、t; 4.6捕獲處理9</b></p><p><b> 5、運(yùn)行結(jié)果10</b></p><p><b> 6、總結(jié)11</b></p><p> 7、課程設(shè)計參考資料11</p><p> 8、源程序代碼11</p><p><b&g
6、t; 1、課程設(shè)計目的</b></p><p> 本課程設(shè)計的目的就是設(shè)計一個解析IP數(shù)據(jù)包的程序,并根據(jù)這個程序,說明IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問題,從而對IP層的工作原理有更好的理解和認(rèn)識。</p><p><b> 2、課程設(shè)計要求</b></p><p> 本設(shè)計的目標(biāo)是捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容
7、,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時寫入日志文件。程序的具體要求如下: 1)以命令行形式運(yùn)行:ipparse logfile,其中ipparse是程序名, 而logfile則代表記錄結(jié)果的日志文件。 2)在標(biāo)準(zhǔn)輸出和日志文件中寫入捕獲的IP包的版本、頭長度、服務(wù)類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標(biāo)識、分段標(biāo)志、分段偏移值、生存時間、上層協(xié)議類型、頭校驗和、源IP地址和目的IP地址等內(nèi)容?!?)當(dāng)程序接收到鍵盤輸入Ctrl+C時退出。&l
8、t;/p><p><b> 3、相關(guān)知識</b></p><p> 互聯(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)中的差異,從而為信息發(fā)送方和接收方提供了透明的傳輸通道.編制本程序前,首先要對IP
9、包的格式有一定了解,圖1給出了IP協(xié)議的數(shù)據(jù)包格式.</p><p> IP數(shù)據(jù)包的第一個字段是版本字段,其度是4位,表示所使用的IP協(xié)議的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要針對版本是IPV4的數(shù)據(jù)包的解析.</p><p> 報頭標(biāo)長字段為4位,它定義了以4B為一個單位的IP包的報文長度.報頭中除了選項字段和填充域字段外,其
10、他各字段是定長的.因此,IP數(shù)據(jù)包的頭長度在20—40B之間,是可變的.</p><p> 0 4 8 16 19 24 31</p><p> 圖1 IP數(shù)據(jù)包的格式</p><p> 服務(wù)類型字段共8位,用于指示路由器如何處理該數(shù)據(jù)包.該字段長度由4位
11、服務(wù)類型(TOS)子域和3位優(yōu)先級子域組成,1位為保留位,該字段結(jié)構(gòu)如圖2所示.</p><p> B7 b6 b5 b4 b3 b2 b1 b0</p><p> 圖2 服務(wù)類型字段結(jié)構(gòu)</p><p> 優(yōu)先級共有8種,優(yōu)先級越高表明數(shù)據(jù)包越重要.表1中列出了各種優(yōu)先級所
12、代表的意義.</p><p> 表一 優(yōu)先子域的說明</p><p> 在4位服務(wù)類型子域中b4,b3,b2,b1分別表示D(延遲),T(吞吐量),R(可靠性)與C(成本).表2列出了服務(wù)器類型自域的構(gòu)成.</p><p> 總長度字段為2B,它定義了以字節(jié)為單位的數(shù)據(jù)包的總長度.IP數(shù)據(jù)包的最大長度為65535B.</p><p>
13、 標(biāo)識字段的長度為16位,用于識別IP數(shù)據(jù)包的編號.每批數(shù)據(jù)都要有一個標(biāo)識值,用于讓目的主機(jī)判斷新來的數(shù)據(jù)屬于哪個分組.</p><p> 報頭中的標(biāo)志字段如圖7-3所示.標(biāo)志字段共3位,最高位是0.禁止分片標(biāo)志DF(do not fragment)字段的值若為1,表示不能對數(shù)據(jù)包分片;若DF值為0,則表明可以分片.分片標(biāo)志MF(more fragment)的值為1,表示接收到的不是最后一個分片;若MF值為
14、0,表示接收到的是最后一個分片.</p><p> 片偏移字段共13位,說明分片在整個數(shù)據(jù)包中的相對位置.片偏移值是以8B為單位來記數(shù)的,因此選擇的分片長度應(yīng)該是8B的整數(shù)倍.</p><p> 生存時間(TTL)字段為8位,用來設(shè)置數(shù)據(jù)包在互聯(lián)網(wǎng)絡(luò)的傳輸過程的壽命,通常是用一個數(shù)據(jù)包可以經(jīng)過的最多的路由器跳步數(shù)來限定的.</p><p> 協(xié)議字段為8位,表
15、示使用此IP數(shù)據(jù)包的高層協(xié)議類型,常用的協(xié)議號如表3所示.</p><p> 表3 典型的協(xié)議號</p><p> 頭校驗和字段為16位,用于存放檢查報頭錯誤的校驗碼。檢驗的范圍是整個IP包的報頭。校驗和按如下方法計算:</p><p> 1)將頭校驗和的字段置為0。</p><p> 2)將報頭部分的所有數(shù)據(jù)以16位為單位進(jìn)行累加
16、,累加方式是求異或。</p><p> 3)將累加的結(jié)果取反碼,就是頭校驗和。</p><p> 當(dāng)收到一個IP包時,要檢查報頭是否出錯,就把報頭中的所有數(shù)據(jù)以16位為單位進(jìn)行累加,若累加的結(jié)果為0,則報文沒有出錯。</p><p> 地址字段包括源地址和目的地址。源地址和目的地址的長度都是32位,分別表示發(fā)送數(shù)據(jù)包的源主機(jī)和目的主機(jī)的IP地址。</p&
17、gt;<p> 選項字段的長度范圍為0~40B,主要用于控制和測試。在使用選項字段的過程中,有可能出現(xiàn)報頭部分的長度不是32位的整數(shù)倍的情況。如果出現(xiàn)這種情況,就需要通過填充位來湊齊。</p><p><b> 4、課程設(shè)計分析</b></p><p><b> 4.1 網(wǎng)卡設(shè)置</b></p><p>
18、; 為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對網(wǎng)卡進(jìn)行編程,在這里使用套接字(socket)進(jìn)行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在騅投遞地址并非自身地址之后將不引起響應(yīng),也就是說應(yīng)用程序無法收取與自己無關(guān)的數(shù)據(jù)包。我們要想獲取網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設(shè)置為混雜模式。</p
19、><p><b> 4.2 使用套接字</b></p><p> 套接字分為三種,即流套接字(Stream socket)、數(shù)據(jù)報套接字(Datagram Socket)和原始套接字(Raw Socket)。要進(jìn)行IP層數(shù)據(jù)包的接收和發(fā)送,應(yīng)使用原始套接字。創(chuàng)建原始套接字的代碼如下:</p><p> Socket sock;</p&g
20、t;<p> sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);</p><p> 本設(shè)計不用考慮超時情況。</p><p> 創(chuàng)建套接后,IP頭就會包含在接收數(shù)據(jù)包中。然后,我可以設(shè)置IP頭操作選項,調(diào)用setsockopt函數(shù)。其中flag設(shè)置為true,并設(shè)定IP-HDRINCL選項,表明用戶可以親自對IP頭進(jìn)行處理。最后使用
21、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包。</p><p> 4.2.2 接收數(shù)據(jù)包</p><p> 在程序中可使用recv()函數(shù)接收經(jīng)過的IP包。該函數(shù)有四個參數(shù)
22、,第一個參數(shù)接收操作所用的套接字描述符;第二個參數(shù)接收緩沖區(qū)的地址;第三個參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個參數(shù)是一個附加標(biāo)志,如果對所發(fā)送的數(shù)據(jù)沒特殊要求,直接設(shè)為0。因為IP數(shù)據(jù)包的最大長度是65535B,因此緩沖區(qū)的大小不能小于65535B。設(shè)置緩沖區(qū)后,可利用循環(huán)來反復(fù)監(jiān)聽接收IP包,用recv()函數(shù)實(shí)現(xiàn)接收功能。</p><p> 4.3 定義IP頭部的數(shù)據(jù)結(jié)構(gòu)</p>
23、<p> 程序需要定義一個數(shù)據(jù)結(jié)構(gòu)表示IP頭部。其代碼如下:</p><p> /* 定義IP頭部數(shù)據(jù)結(jié)構(gòu) */</p><p> typedef struct _IP_HEADER{</p><p><b> union{</b></p><p> BYTE Version; //版本(前4位)
24、</p><p> BYTE HdrLen; //報頭標(biāo)長(后四位),IP頭長度</p><p><b> };</b></p><p> BYTE ServiceType; //服務(wù)類型</p><p> WORD TotalLen; //總長度</p><p> WORD ID; /
25、/標(biāo)識</p><p><b> union{</b></p><p> WORD Flags;</p><p> WORD FragOff;</p><p><b> };</b></p><p> BYTE TimeToLive;</p><
26、p> BYTE Protocol;</p><p> WORD HdrChksum;</p><p> DWORD SrcAddr;</p><p> DWORD DstAddr;</p><p> BYTE Options;</p><p> }IP_HEADER;</p><p
27、> 4.4 IP包的解析</p><p> 解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段(或子字段)時,可以利用IP-HEADER的成員直接獲取。要解析長度不是8位倍數(shù)的字段(或子字段)時,可以利用C語言中的移位以人、及與、或操作完成。</p><p><b> 4.5 協(xié)議的定義</b></p><p> (
28、包含相應(yīng)的頭文件#include #include):</p><p> DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包*/dwProtocol=IPPROTO_IP; /*協(xié)議類型為IP*/</p><p><b> 4.6捕獲處理</b></p><p> 1.加載 Winsock;<
29、/p><p> 2.創(chuàng)建一個接收原始IP包的socket連接;3.綁定到一個接口;4.進(jìn)行WSAIoctl設(shè)置,接收所有的IP數(shù)據(jù)包。</p><p> 代碼如下:if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval),NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_E
30、RROR)5.接著設(shè)定一個線程進(jìn)行捕獲:(1)創(chuàng)建一個接收IP包的鏈表頭;(2)設(shè)置一個標(biāo)識,為真,則不斷進(jìn)行IP包的捕獲;(3)建立一個新的結(jié)點(diǎn),將捕獲的數(shù)據(jù)包加入到該結(jié)點(diǎn);(4)如果鏈表的長度達(dá)到指定的長度,創(chuàng)建一個線程對該鏈表的IP包進(jìn)行解析;再設(shè)置一個在IP數(shù)據(jù)包鏈表不足給定的長度,而又中止IP捕獲時,對鏈表的處理;(5)為下一個IP包鏈表創(chuàng)建一個鏈表頭。6.建立一個進(jìn)行IP包解析并顯示的線程,進(jìn)行解析IP數(shù)據(jù)包,
31、然后顯示IP數(shù)據(jù)包。</p><p><b> 5、運(yùn)行結(jié)果</b></p><p> 截獲IP數(shù)據(jù)包程序運(yùn)行結(jié)果如下:</p><p><b> 6、總結(jié)</b></p><p> 這次計算機(jī)網(wǎng)絡(luò)課程設(shè)計是解析IP數(shù)據(jù)包,通過這次上機(jī)充分應(yīng)用了所學(xué)的計算機(jī)網(wǎng)絡(luò)和C語言的知識,并上網(wǎng)搜索一
32、部分相當(dāng)資料,粗略設(shè)計出該程序。</p><p> 通過本次課程設(shè)計,充分運(yùn)用了所學(xué)的計算機(jī)網(wǎng)絡(luò)知識,設(shè)計出了如何解析IP數(shù)據(jù)包,從而更加深刻的了解到了IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問題,從而對IP層的工作原理有更好的理解和認(rèn)識。</p><p> 計算機(jī)網(wǎng)絡(luò)的設(shè)計是一個要求動手能力很強(qiáng)的一門實(shí)踐課程,在課程設(shè)計期間我努力將自己以前所學(xué)的理論知識向?qū)嵺`方面轉(zhuǎn)化,盡量做到理論與實(shí)踐相結(jié)
33、合,在課程設(shè)計期間能夠遵守紀(jì)律規(guī)章,不遲到、早退,認(rèn)真完成老師布置的任務(wù),同時也發(fā)現(xiàn)了自己的許多不足之處。</p><p> 在課程設(shè)計的過程也碰到的不少問題。該程序也存在著不少的缺陷,比如并不是所有的數(shù)據(jù)包都能捕獲,如:IP數(shù)據(jù)包以外的數(shù)據(jù)包都抓不到;只支持ICMP、IGMP、TCP、UDP這些協(xié)議。</p><p> 課程設(shè)計是培養(yǎng)我們綜合運(yùn)用所學(xué)知識,發(fā)現(xiàn)、提出、分析、解決問題的
34、一個過程,是對我們所學(xué)知識及綜合能力的一次考察。隨著科學(xué)技術(shù)日新月異的不斷發(fā)展,計算機(jī)網(wǎng)絡(luò)也在不斷的變化發(fā)展當(dāng)中,這就要求我們用相應(yīng)的知識來武裝自己,夯實(shí)基礎(chǔ),為將來走向工作崗位,貢獻(xiàn)社會做好充分的準(zhǔn)備。</p><p> 7、課程設(shè)計參考資料</p><p> 1.《計算機(jī)網(wǎng)絡(luò)(第5版)》 主編:謝希仁 出版社:電子工業(yè)出版社 出版時間:2009年11月</p&g
35、t;<p> 2. 《數(shù)據(jù)通信與網(wǎng)絡(luò)(第四版)》吳時霖 周正康 吳永輝 譯</p><p><b> 8、源程序代碼</b></p><p> #include "winsock2.h"</p><p> #include "ws2tcpip.h"</p><p&
36、gt; #include "iostream.h"</p><p> #include "stdio.h"</p><p> #pragma comment(lib, "ws2_32.lib")</p><p> #define IO_RCVALL _WSAIOW(IOC_VENDOR,1)<
37、/p><p> #define BUFFER_SIZE 65535</p><p> /* 定義IP頭部數(shù)據(jù)結(jié)構(gòu) */</p><p> typedef struct _IP_HEADER{</p><p><b> union{</b></p><p> BYTE Version; //版
38、本(前4位)</p><p> BYTE HdrLen; //報頭標(biāo)長(后四位),IP頭長度</p><p><b> };</b></p><p> BYTE ServiceType; //服務(wù)類型</p><p> WORD TotalLen; //總長度</p><p> WORD
39、 ID; //標(biāo)識</p><p><b> union{</b></p><p> WORD Flags;</p><p> WORD FragOff;</p><p><b> };</b></p><p> BYTE TimeToLive;</p>
40、<p> BYTE Protocol;</p><p> WORD HdrChksum;</p><p> DWORD SrcAddr;</p><p> DWORD DstAddr;</p><p> BYTE Options;</p><p> }IP_HEADER;</p>
41、<p> //逐位解析IP頭中的信息,獲取版本號</p><p> void getVersion(BYTE b,BYTE &version)</p><p><b> {</b></p><p> version = b>>4;</p><p><b> }</
42、b></p><p> void getIHL(BYTE b,BYTE &result)</p><p><b> {</b></p><p> result = (b & 0x0f) *4;</p><p><b> }</b></p><p>
43、;<b> //解析服務(wù)類型</b></p><p> char * parseServiceType_getProcedence(BYTE b){</p><p> switch(b>>5){</p><p><b> case 7:</b></p><p> return
44、"Network Control";</p><p><b> case 6:</b></p><p> return "Internet work Control";</p><p><b> case 5:</b></p><p> return
45、"CRITIC/ECP";</p><p><b> case 4:</b></p><p> return "Flash Override";</p><p><b> case 3:</b></p><p> return "Falsh&
46、quot;;</p><p><b> case 2:</b></p><p> return "Immediate";</p><p><b> case 1:</b></p><p> return "Priority";</p>&
47、lt;p><b> case 0:</b></p><p> return "Routine";</p><p><b> default:</b></p><p> return "Unknown";</p><p><b> }&
48、lt;/b></p><p><b> }</b></p><p> char * parseServiceType_getTOS(BYTE b){</p><p> b=(b>>1)&0x0f;</p><p> switch(b){</p><p><b
49、> case 0:</b></p><p> return "Normal service";</p><p><b> case 1:</b></p><p> return "Minimize monetary cost";</p><p><b
50、> case 2:</b></p><p> return "Maximize reliability";</p><p><b> case 4:</b></p><p> return "Maximize throughput";</p><p>&l
51、t;b> case 8:</b></p><p> return "Minimize delay";</p><p><b> case 15:</b></p><p> return "Maximize security";</p><p><b&
52、gt; default:</b></p><p> return "Unknown";</p><p><b> }</b></p><p><b> }</b></p><p> /* 獲取禁止分片標(biāo)志和分片標(biāo)志 */</p><p&g
53、t; void getFlags(WORD w,BYTE &DF, BYTE &MF){</p><p> DF=(w>>14)&0x01;</p><p> MF=(w>>13)&0x01;</p><p><b> }</b></p><p> /*
54、獲取分片偏移量 */</p><p> void getFragoff(WORD w,WORD &fragoff){</p><p> fragoff=w&0x1ffff;</p><p><b> }</b></p><p><b> //獲取協(xié)議</b></p>
55、;<p> char * getProtocol(BYTE Protocol){</p><p> switch (Protocol){</p><p><b> case 1: </b></p><p> return "ICMP";</p><p><b> ca
56、se 2:</b></p><p> return "IGMP";</p><p><b> case 3:</b></p><p> return "GGP";</p><p><b> case 4:</b></p>&l
57、t;p> return "IP in IP ";</p><p><b> case 6:</b></p><p> return "TCP";</p><p><b> case 8:</b></p><p> return "EG
58、P";</p><p><b> case 17:</b></p><p> return "UDP";</p><p><b> case 41:</b></p><p> return "IPv6";</p><p&g
59、t;<b> case 46:</b></p><p> return "OSPF";</p><p><b> default:</b></p><p> return "UNKNOWN";</p><p><b> }</b>
60、;</p><p><b> }</b></p><p> /* 解析IP數(shù)據(jù)包 */</p><p> void ipparse(FILE * file,char *buffer){</p><p> IP_HEADER ip = *(IP_HEADER *)buffer;</p><p&g
61、t; fseek(file,0,SEEK_END);</p><p> BYTE version;</p><p> getVersion(ip.Version,version);</p><p> fprintf(file,"版本=IPV%d\r\n",version);</p><p> BYTE heade
62、rLen;</p><p> getIHL(ip.HdrLen,headerLen);</p><p> fprintf(file,"頭長度=%d(BYTE)\r\n",headerLen);</p><p> fprintf(file,"服務(wù)類型=%s,%s\r\n",</p><p> pa
63、rseServiceType_getProcedence(ip.ServiceType),</p><p> parseServiceType_getTOS(ip.ServiceType));</p><p> fprintf(file,"數(shù)據(jù)報長度=%d(BYTE)\r\n",ip.TotalLen);</p><p> fprintf(
64、file,"數(shù)據(jù)報ID=%d\r\n",ip.ID);</p><p> /* DF表示禁止分片標(biāo)志,MF表示分片標(biāo)記 */</p><p> BYTE DF,MF;</p><p> getFlags(ip.Flags,DF,MF);</p><p> fprintf(file,"分段標(biāo)志 DF=%d,
65、MF=%d\r\n",DF,MF);</p><p> WORD fragOff;</p><p> getFragoff(ip.FragOff,fragOff);</p><p> fprintf(file,"分段偏移值=%d\r\n",fragOff);</p><p> fprintf(file,&
66、quot;生存期=%d(hops)\r\n",ip.TimeToLive);</p><p> fprintf(file,"協(xié)議=%s\r\n",getProtocol(ip.Protocol));</p><p> fprintf(file,"頭校驗和=0x%0x\r\n",ip.HdrChksum);</p><
67、p> fprintf(file,"源IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));</p><p> fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));</p><p> fprintf(file
68、,"__________________________________\r\n");</p><p><b> }</b></p><p> /* 程序入口 */</p><p> int main(int argc,char *argv[]){</p><p> /* cmd參數(shù) */&l
69、t;/p><p> if(argc!=2){</p><p> printf("usage error!\n");</p><p> return -1;</p><p><b> }</b></p><p> FILE *file;</p><p&g
70、t; /* 以讀寫的方式建立一個文本文件logfile.txt */</p><p> if((file=fopen(argv[1],"w+"))==NULL){</p><p> printf("fail to open file %s","logfile.txt");</p><p> retu
71、rn -1;</p><p><b> }</b></p><p> WSAData wsData;</p><p> /* 啟動2.2版本的Socket,并將Socket版本信息保存到wsData中 */</p><p> if(WSAStartup(MAKEWORD(2,2),&wsData)!=0)
72、{</p><p> printf("WSA startup failed!\n");</p><p> return -1;</p><p><b> }</b></p><p> fprintf(file,"Socket初始化...\r\n");</p>
73、<p> fprintf(file,"==================================\r\n");</p><p> fprintf(file,"描述:%s\r\n",wsData.szDescription);</p><p> fprintf(file,"狀態(tài):%s\r\n",wsData
74、.szSystemStatus);</p><p> fprintf(file,"==================================\r\n");</p><p> SOCKET sock;</p><p> /* 創(chuàng)建原始套接字 */</p><p> if((sock=socket(AF_IN
75、ET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET){</p><p> printf("Can not create socket!\n");</p><p> return -1;</p><p><b> }</b></p><p> BOOL flag=t
76、rue;</p><p> /* 設(shè)置IP頭操作選項 */</p><p> if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag))==SOCKET_ERROR){</p><p> printf("setsockopt failed!\n");<
77、/p><p> return -1;</p><p><b> }</b></p><p> char hostName[128];</p><p> /* 獲取本地主機(jī)名 */</p><p> if(gethostname(hostName,100)==SOCKET_ERROR){<
78、;/p><p> printf("gethostname failed!\n");</p><p> return -1;</p><p><b> }</b></p><p> hostent *pHostIP;</p><p> /* 根據(jù)主機(jī)名獲取主機(jī)信息 */&l
79、t;/p><p> if((pHostIP=gethostbyname(hostName))==NULL){</p><p> printf("gethostbyname failed!\n");</p><p> return -1;</p><p><b> }</b></p>
80、<p> printf("Hostname: %s\r\n",pHostIP->h_name);</p><p> printf("IPAddress: %s\r\n",inet_ntoa(*((struct in_addr *)pHostIP->h_addr)));</p><p> /* 封裝IP地址信息 */<
81、/p><p> sockaddr_in addr_in;</p><p> addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];</p><p> addr_in.sin_family=AF_INET;</p><p> addr_in.sin_port=htons(6000);
82、//監(jiān)聽的端口號</p><p> /* 把Socket綁定到本地網(wǎng)卡 */</p><p> if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR){</p><p> printf("bind failed");</p><p>
83、 return -1;</p><p><b> }</b></p><p> DWORD dwBufferLen[10];</p><p> DWORD dwBufferInLen=1;</p><p> DWORD dwBytesReturned=0;</p><p> /* 設(shè)置網(wǎng)
84、卡為混雜模式 */</p><p> if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),</p><p> &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR){</p>&
85、lt;p> printf("icotlsocket failed\n");</p><p> return -1;</p><p><b> }</b></p><p> char buffer[BUFFER_SIZE];</p><p> printf("=========
86、====開始解析=============\r\n");</p><p> while(true){</p><p> /* 從套接字接收IP數(shù)據(jù)報 */</p><p> int size=recv(sock,buffer,BUFFER_SIZE,0);</p><p> if(size>0){</p>
87、<p> ipparse(stdout,buffer);</p><p> ipparse(file,buffer);</p><p><b> }</b></p><p><b> }</b></p><p> /* 解除Socket綁定 */</p><
88、p> if(WSACleanup()==SOCKET_ERROR){</p><p> printf("WSACleanup failed!\n");</p><p> return -1;</p><p><b> }</b></p><p> /* 關(guān)閉文件 */</p>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計---ip數(shù)據(jù)包解析報告
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計---監(jiān)控ip數(shù)據(jù)包流量
- 解析arp數(shù)據(jù)包-計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計tcp數(shù)據(jù)包
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計---網(wǎng)絡(luò)協(xié)議數(shù)據(jù)包
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計---基于wireshark的網(wǎng)絡(luò)數(shù)據(jù)包內(nèi)容解析
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計-監(jiān)控ip包流量
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計報告--監(jiān)控ip包流量
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計--端口檢測及ip包的捕獲解析
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計--數(shù)據(jù)包發(fā)送和接受程序的實(shí)現(xiàn)
- 解析ip數(shù)據(jù)包課程設(shè)計
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 《計算機(jī)網(wǎng)絡(luò)課程設(shè)計》
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計
- 計算機(jī)網(wǎng)絡(luò)課程設(shè)計---網(wǎng)絡(luò)設(shè)計
評論
0/150
提交評論