2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  計(jì)算機(jī)網(wǎng)絡(luò)工程課程設(shè)計(jì)報(bào)告</p><p>  題 目: 解析IP數(shù)據(jù)包 </p><p>  學(xué)生姓名: </p><p>  學(xué) 號: </p><p>  專業(yè)班級:

2、 </p><p>  同組姓名:   </p><p>  指導(dǎo)教師: </p><p>  設(shè)計(jì)時(shí)間: 2013年下學(xué)期第16周 </p><p><b>  目錄</

3、b></p><p><b>  目錄2</b></p><p>  1、課程設(shè)計(jì)目的2</p><p>  2、課程設(shè)計(jì)要求2</p><p><b>  3、相關(guān)知識2</b></p><p>  4、課程設(shè)計(jì)分析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è)計(jì)參考資料11</p><p>  8、源程序代碼11</p><p><b&g

6、t;  1、課程設(shè)計(jì)目的</b></p><p>  本課程設(shè)計(jì)的目的就是設(shè)計(jì)一個(gè)解析IP數(shù)據(jù)包的程序,并根據(jù)這個(gè)程序,說明IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問題,從而對IP層的工作原理有更好的理解和認(rèn)識。</p><p><b>  2、課程設(shè)計(jì)要求</b></p><p>  本設(shè)計(jì)的目標(biāo)是捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容

7、,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時(shí)寫入日志文件。程序的具體要求如下:  1)以命令行形式運(yùn)行:ipparse logfile,其中ipparse是程序名, 而logfile則代表記錄結(jié)果的日志文件。 2)在標(biāo)準(zhǔn)輸出和日志文件中寫入捕獲的IP包的版本、頭長度、服務(wù)類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標(biāo)識、分段標(biāo)志、分段偏移值、生存時(shí)間、上層協(xié)議類型、頭校驗(yàn)和、源IP地址和目的IP地址等內(nèi)容?!?)當(dāng)程序接收到鍵盤輸入Ctrl+C時(shí)退出。&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ù)包格式,以消除個(gè)通信子網(wǎng)中的差異,從而為信息發(fā)送方和接收方提供了透明的傳輸通道.編制本程序前,首先要對IP

9、包的格式有一定了解,圖1給出了IP協(xié)議的數(shù)據(jù)包格式.</p><p>  IP數(shù)據(jù)包的第一個(gè)字段是版本字段,其度是4位,表示所使用的IP協(xié)議的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要針對版本是IPV4的數(shù)據(jù)包的解析.</p><p>  報(bào)頭標(biāo)長字段為4位,它定義了以4B為一個(gè)單位的IP包的報(bào)文長度.報(bào)頭中除了選項(xiàng)字段和填充域字段外,其

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ù)都要有一個(gè)標(biāo)識值,用于讓目的主機(jī)判斷新來的數(shù)據(jù)屬于哪個(gè)分組.</p><p>  報(bào)頭中的標(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,表示接收到的不是最后一個(gè)分片;若MF值為

14、0,表示接收到的是最后一個(gè)分片.</p><p>  片偏移字段共13位,說明分片在整個(gè)數(shù)據(jù)包中的相對位置.片偏移值是以8B為單位來記數(shù)的,因此選擇的分片長度應(yīng)該是8B的整數(shù)倍.</p><p>  生存時(shí)間(TTL)字段為8位,用來設(shè)置數(shù)據(jù)包在互聯(lián)網(wǎng)絡(luò)的傳輸過程的壽命,通常是用一個(gè)數(shù)據(jù)包可以經(jīng)過的最多的路由器跳步數(shù)來限定的.</p><p>  協(xié)議字段為8位,表

15、示使用此IP數(shù)據(jù)包的高層協(xié)議類型,常用的協(xié)議號如表3所示.</p><p>  表3 典型的協(xié)議號</p><p>  頭校驗(yàn)和字段為16位,用于存放檢查報(bào)頭錯(cuò)誤的校驗(yàn)碼。檢驗(yàn)的范圍是整個(gè)IP包的報(bào)頭。校驗(yàn)和按如下方法計(jì)算:</p><p>  1)將頭校驗(yàn)和的字段置為0。</p><p>  2)將報(bào)頭部分的所有數(shù)據(jù)以16位為單位進(jìn)行累加

16、,累加方式是求異或。</p><p>  3)將累加的結(jié)果取反碼,就是頭校驗(yàn)和。</p><p>  當(dāng)收到一個(gè)IP包時(shí),要檢查報(bào)頭是否出錯(cuò),就把報(bào)頭中的所有數(shù)據(jù)以16位為單位進(jìn)行累加,若累加的結(jié)果為0,則報(bào)文沒有出錯(cuò)。</p><p>  地址字段包括源地址和目的地址。源地址和目的地址的長度都是32位,分別表示發(fā)送數(shù)據(jù)包的源主機(jī)和目的主機(jī)的IP地址。</p&

17、gt;<p>  選項(xiàng)字段的長度范圍為0~40B,主要用于控制和測試。在使用選項(xiàng)字段的過程中,有可能出現(xiàn)報(bào)頭部分的長度不是32位的整數(shù)倍的情況。如果出現(xiàn)這種情況,就需要通過填充位來湊齊。</p><p><b>  4、課程設(shè)計(jì)分析</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ù)報(bào)套接字(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è)計(jì)不用考慮超時(shí)情況。</p><p>  創(chuàng)建套接后,IP頭就會包含在接收數(shù)據(jù)包中。然后,我可以設(shè)置IP頭操作選項(xiàng),調(diào)用setsockopt函數(shù)。其中flag設(shè)置為true,并設(shè)定IP-HDRINCL選項(xiàng),表明用戶可以親自對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ù)有四個(gè)參數(shù)

22、,第一個(gè)參數(shù)接收操作所用的套接字描述符;第二個(gè)參數(shù)接收緩沖區(qū)的地址;第三個(gè)參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個(gè)參數(shù)是一個(gè)附加標(biāo)志,如果對所發(fā)送的數(shù)據(jù)沒特殊要求,直接設(shè)為0。因?yàn)镮P數(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>  程序需要定義一個(gè)數(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; //報(bào)頭標(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位的字段(或子字段)時(shí),可以利用IP-HEADER的成員直接獲取。要解析長度不是8位倍數(shù)的字段(或子字段)時(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)建一個(gè)接收原始IP包的socket連接;3.綁定到一個(gè)接口;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è)定一個(gè)線程進(jìn)行捕獲:(1)創(chuàng)建一個(gè)接收IP包的鏈表頭;(2)設(shè)置一個(gè)標(biāo)識,為真,則不斷進(jìn)行IP包的捕獲;(3)建立一個(gè)新的結(jié)點(diǎn),將捕獲的數(shù)據(jù)包加入到該結(jié)點(diǎn);(4)如果鏈表的長度達(dá)到指定的長度,創(chuàng)建一個(gè)線程對該鏈表的IP包進(jìn)行解析;再設(shè)置一個(gè)在IP數(shù)據(jù)包鏈表不足給定的長度,而又中止IP捕獲時(shí),對鏈表的處理;(5)為下一個(gè)IP包鏈表創(chuàng)建一個(gè)鏈表頭。6.建立一個(gè)進(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ì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)是解析IP數(shù)據(jù)包,通過這次上機(jī)充分應(yīng)用了所學(xué)的計(jì)算機(jī)網(wǎng)絡(luò)和C語言的知識,并上網(wǎng)搜索一

32、部分相當(dāng)資料,粗略設(shè)計(jì)出該程序。</p><p>  通過本次課程設(shè)計(jì),充分運(yùn)用了所學(xué)的計(jì)算機(jī)網(wǎng)絡(luò)知識,設(shè)計(jì)出了如何解析IP數(shù)據(jù)包,從而更加深刻的了解到了IP數(shù)據(jù)包的結(jié)構(gòu)及IP協(xié)議的相關(guān)問題,從而對IP層的工作原理有更好的理解和認(rèn)識。</p><p>  計(jì)算機(jī)網(wǎng)絡(luò)的設(shè)計(jì)是一個(gè)要求動手能力很強(qiáng)的一門實(shí)踐課程,在課程設(shè)計(jì)期間我努力將自己以前所學(xué)的理論知識向?qū)嵺`方面轉(zhuǎn)化,盡量做到理論與實(shí)踐相結(jié)

33、合,在課程設(shè)計(jì)期間能夠遵守紀(jì)律規(guī)章,不遲到、早退,認(rèn)真完成老師布置的任務(wù),同時(shí)也發(fā)現(xiàn)了自己的許多不足之處。</p><p>  在課程設(shè)計(jì)的過程也碰到的不少問題。該程序也存在著不少的缺陷,比如并不是所有的數(shù)據(jù)包都能捕獲,如:IP數(shù)據(jù)包以外的數(shù)據(jù)包都抓不到;只支持ICMP、IGMP、TCP、UDP這些協(xié)議。</p><p>  課程設(shè)計(jì)是培養(yǎng)我們綜合運(yùn)用所學(xué)知識,發(fā)現(xiàn)、提出、分析、解決問題的

34、一個(gè)過程,是對我們所學(xué)知識及綜合能力的一次考察。隨著科學(xué)技術(shù)日新月異的不斷發(fā)展,計(jì)算機(jī)網(wǎng)絡(luò)也在不斷的變化發(fā)展當(dāng)中,這就要求我們用相應(yīng)的知識來武裝自己,夯實(shí)基礎(chǔ),為將來走向工作崗位,貢獻(xiàn)社會做好充分的準(zhǔn)備。</p><p>  7、課程設(shè)計(jì)參考資料</p><p>  1.《計(jì)算機(jī)網(wǎng)絡(luò)(第5版)》 主編:謝希仁 出版社:電子工業(yè)出版社 出版時(shí)間:2009年11月</p&g

35、t;<p>  2. 《數(shù)據(jù)通信與網(wǎng)絡(luò)(第四版)》吳時(shí)霖 周正康 吳永輝 譯</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; //報(bào)頭標(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ù)報(bào)長度=%d(BYTE)\r\n",ip.TotalLen);</p><p>  fprintf(

64、file,"數(shù)據(jù)報(bào)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,"頭校驗(yàn)和=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;  /* 以讀寫的方式建立一個(gè)文本文件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頭操作選項(xiàng) */</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ù)報(bào) */</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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論