

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計任務書</b></p><p><b> 目錄</b></p><p><b> 1.實驗目的</b></p><p><b> 2.實驗要求</b></p><p><b> 3.預備知識</
2、b></p><p><b> 4.課程設計分析</b></p><p><b> 5.實現過程</b></p><p><b> 6.程序流程圖</b></p><p><b> 7.相關擴展</b></p><p>
3、;<b> 8.實習體會</b></p><p><b> 9.參考文獻</b></p><p><b> 一.實驗目的:</b></p><p> 設計一個解析IP數據包的程序,并根據這個程序,說明IP數據包的結構及IP協議的相關問題,從而IP層的工作原理有更好的理解和認識.</p&g
4、t;<p> 二.實驗要求 : </p><p> 本設計的目標是捕獲網絡中數據包,解析數據包的內容,將、結果顯示在標準輸出上,并同時寫入日志文件.</p><p> 程序的具體要求如下:</p><p> 以命令行形式運行:ipparse logfile,其中ipparse是程序名,而logfile則代表記錄結果的日志文
5、件.</p><p> 在標準輸出和日志文件中寫入捕獲的IP數據包的版本,頭長度,服務類型,數據包總長度,數據包標識,分段標志,分段偏移值,生存時間,上層協議類型,頭校驗和,源IP地址和目的IP地址等內容.</p><p> 當程序接收到鍵盤輸入Ctrl+C時退出.</p><p><b> 三.預備知識 </b></p>
6、<p> 互聯網絡層是TCP/IP協議參考模型中的關鍵部分.IP協議把傳輸層送來的消息組裝成IP數據包,并把IP數據包傳送給數據鏈層.IP協議在TCP/IP協議族中處于核心地位,IP協議制定了統(tǒng)一的IP數據包格式,以消除個通信子網中的差異,從而為信息發(fā)送方和接收方提供了透明的傳輸通道.編制本程序前,首先要對IP包的格式有一定了解,圖1給出了IP協議的數據包格式.</p><p> IP數據包的第一
7、個字段是版本字段,其度是4位,表示所使用的IP協議的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要針對版本是IPV4的數據包的解析.</p><p> 報頭標長字段為4位,它定義了以4B為一個單位的IP包的報文長度.報頭中除了選項字段和填充域字段外,其他各字段是定長的.因此,IP數據包的頭長度在20—40B之間,是可變的.</p><p>
8、 0 4 8 16 19 24 31</p><p> 圖1 IP數據包的格式</p><p> 服務類型字段共8位,用于指示路由器如何處理該數據包.該字段長度由4位服務類型(TOS)子域和3位優(yōu)先級子域組成,1位為保留位,該字段結構如圖2所示.</p&
9、gt;<p> B7 b6 b5 b4 b3 b2 b1 b0</p><p> 圖2 服務類型字段結構</p><p> 優(yōu)先級共有8種,優(yōu)先級越高表明數據包越重要.表1中列出了各種優(yōu)先級所代表的意義.</p><p> 表一 優(yōu)先子域
10、的說明</p><p> 在4位服務類型子域中b4,b3,b2,b1分別表示D(延遲),T(吞吐量),R(可靠性)與C(成本).表2列出了服務器類型自域的構成.</p><p> 總長度字段為2B,它定義了以字節(jié)為單位的數據包的總長度.IP數據包的最大長度為65535B.</p><p> 標識字段的長度為16位,用于識別IP數據包的編號.每批數據都要有一個標
11、識值,用于讓目的主機判斷新來的數據屬于哪個分組.</p><p> 報頭中的標志字段如圖7-3所示.標志字段共3位,最高位是0.禁止分片標志DF(do not fragment)字段的值若為1,表示不能對數據包分片;若DF值為0,則表明可以分片.分片標志MF(more fragment)的值為1,表示接收到的不是最后一個分片;若MF值為0,表示接收到的是最后一個分片.</p><p>
12、 片偏移字段共13位,說明分片在整個數據包中的相對位置.片偏移值是以8B為單位來記數的,因此選擇的分片長度應該是8B的整數倍.</p><p> 生存時間(TTL)字段為8位,用來設置數據包在互聯網絡的傳輸過程的壽命,通常是用一個數據包可以經過的最多的路由器跳步數來限定的.</p><p> 協議字段為8位,表示使用此IP數據包的高層協議類型,常用的協議號如表7-3所示.</p
13、><p> 表7-3 典型的協議號</p><p> 頭校驗和字段為16位,用于存放檢查報頭錯誤的校驗碼。檢驗的范圍是整個IP包的報頭。校驗和按如下方法計算:</p><p> 1)將頭校驗和的字段置為0。</p><p> 2)將報頭部分的所有數據以16位為單位進行累加,累加方式是求異或。</p><p> 3
14、)將累加的結果取反碼,就是頭校驗和。</p><p> 當收到一個IP包時,要檢查報頭是否出錯,就把報頭中的所有數據以16位為單位進行累加,若累加的結果為0,則報文沒有出錯。</p><p> 地址字段包括源地址和目的地址。源地址和目的地址的長度都是32位,分別表示發(fā)送數據包的源主機和目的主機的IP地址。</p><p> 選項字段的長度范圍為0~40B,主要
15、用于控制和測試。在使用選項字段的過程中,有可能出現報頭部分的長度不是32位的整數倍的情況。如果出現這種情況,就需要通過填充位來湊齊。</p><p><b> 四.課程設計分析</b></p><p> 為了獲取網絡中的IP數據包,必須對網卡進行編程,在這里我們使用套接字(socket)進行編程。但是,在通常情況下,網絡通信的套接字程序只能響應與自己硬件地址相匹配
16、的數據包或是以廣播形式出發(fā)的數據包。對于其他形式的數據包,如已到達網絡接口但卻不是發(fā)送到此地址的數據包,網絡接口在驗證投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關的數據包。我們要想獲取流經網絡設備的所有數據包,就需要將網卡設置為混雜模式。</p><p> 本程序主要由三部分構成:初始化原始套接字,反復監(jiān)聽捕獲數據包和解析數據包。下面就結合核心代碼對程序的具體實現進行講解,同時使程序
17、流程更加清晰,去掉了錯誤檢查等保護性代碼。</p><p><b> 使用原始套接字</b></p><p> 套接字分為三種,即流套接字(Stream Socket)、數據報套接字(Datagram Socket)和原始套接字(Raw Socket)。要進行IP數據包的接受與發(fā)送,應使用原始套接字。創(chuàng)建原始套接字的代碼如下:</p><p&g
18、t; SOCKET sock;</p><p> Sock=WSASoccet(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERRLAPPED);</p><p> 在WSASoccet函數中,第一個參數指定通信發(fā)生的區(qū)字段,AF_INET是針對Internet的,允許在遠程主機之間通信。第二個參數是套接字的類型,AF_INET地址族下
19、,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三種套接字類型。在這里,我們設置為SOCK_RAW,表示我們聲明的是一個原始套接字類型。第三個參數依賴于第二個參數,用于指定套接字所用的特定協議,這里使用IP協議。第四個參數為WSAPROTOCOL_INFO位,該位可以置空,永遠置0。第六個參數是標志位,WSA_FLAG_OVERRLAPPED表明可以使用發(fā)送接收超時設置,本課程設計也可以把這個標志位設置為NULL,因為
20、本設計不用考慮超時情況。</p><p> 創(chuàng)建原始套接字后,IP頭就會包含在接收的數據中。然后,我們可以設置IP頭操作選項,調用sotscockpot函數。其中flag設置為TRUE,并設定IP_HDRINCL選項,表明用戶可以親自對IP頭進行處理。</p><p> BOOL flag=true;</p><p> setsockopt (sock,IPP
21、ROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag));</p><p> 之后,使用如下代碼完成對socket的初始化工作</p><p><b> /*獲取主機名*/</b></p><p> char hostname[128];</p><p> gethost
22、name(hostname, 100);</p><p> /*獲取IP地址*/</p><p> hostent *pHostIP;</p><p> pHostIP=gethostbyname(hostname);</p><p> /* 填充SOCKADDR_IN的結構內容*/</p><p> soc
23、kaddr_in addr_in;</p><p> addr_in.sin_addr= *(in_addr*)pHostIP->h_addr_list[0];</p><p> addr_in.sin_family=AF_TNET;</p><p> addr-in.sin_port=htons(6000);</p><p>
24、 /* 綁定socket */</p><p> bind(sock, (POSCKADDR)&addr_in,sizeof(addr_in));</p><p> 填寫sockaddr_in的內容時,其地址值應填寫為本機IP地址可以通過gethostbyname()函數獲??;端口號可以隨便填寫,但不能與系統(tǒng)沖突;協議族應填寫為AF_INET。注意,sockaddr_in 結構
25、的值必須是以網絡字節(jié)順序表示的值,而不能直接使用本機字節(jié)順序的值,使用htoms()函數可以將無符號短整型的主機數據轉換為網絡字節(jié)的順序的數據。最后使用bind()函數將socket綁定到本地網卡上。</p><p> 綁定網卡后,需要WSAIoctl()函數把網卡設置為混雜模式,使網卡能夠接收所有網絡數據,其關鍵代碼如下:</p><p> #define SIO_RCVALL_WS
26、AIOW(IOC_VENDOR,1)</p><p> DWORD dwBufferLen[10];</p><p> DWORD dwBufferInLen=1;</p><p> DWORD dwBytesReturned=0;</p><p> WSAIoctl(SnifferSocket,IO-RCVALL,&dwBu
27、fferInLen,sizeof(dwBufferInLen),&dwBufferLen,Sizeof(dwBufferLen),&dwByteReturned,NULL,NULL);</p><p> 如果接收的數據包中的協議類型和定義的原始套接字匹配,那么接收到的數據就拷貝到套接字中。因此,網卡就可以接收所有經過的IP包。</p><p><b> 2.接
28、收數據包</b></p><p> 在程序中可使用RECV()函數接收經過的IP包。該函數有四個參數,第一個參數接收操作所用的套接字描述符;第二個參數接收到緩沖區(qū)的地址;第二個參數接收緩沖區(qū)的地址;第三個參數接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數;第四個參數是一個附加標志,如果對所發(fā)送的數據沒特殊要求,直接設為0。因為IP數據包的最大長度是65536B,因此緩沖區(qū)的大小不能小于65535B。設置緩
29、沖區(qū)后,可利用循環(huán)來反復監(jiān)聽接收IP包,用recv()函數接收功能的代碼如下:</p><p> #dedine BUFFER_SIZE 65535</p><p> Char buffer[BUFFER_SIZE]; //設置緩沖區(qū)</p><p> While(true)</p><p> {recv(sock,buffer,
30、BUFFER_SIZE,0); //j接收數據包</p><p><b> ……..</b></p><p> 3.定義IP頭部的數據結構</p><p> 程序需要定義一個數據結構表示IP頭部。這個數據結構應該和圖7-1吻合,其代碼如下:</p><p> typedef struct _IP_HEADE
31、R //定義IP頭</p><p><b> {</b></p><p><b> union</b></p><p><b> {</b></p><p> BYTE Version; //版本前4位</p><p> BYTE HdrLe
32、n; //報頭標長(后四位),IP頭長度</p><p><b> };</b></p><p> BYTE ServiceType;//服務類型</p><p> WORD TotalLen; //總長度</p><p> WORD ID; //標識</p><p><b>
33、; union </b></p><p><b> {</b></p><p> WORD Flags; //標志</p><p> Word FragOff; //分段偏移</p><p><b> };</b></p><p> BYTE Ti
34、meToLive; //生命期</p><p> BYTE Protiocol; //協議</p><p> WORD HdrChksum; //頭校驗和</p><p> DWORD SrcAddr; //源地址</p><p> DWORD DstAddr: //目的地址</p><p> BYTE
35、 Options; //選項</p><p> }IP_HEADER;</p><p> 這是我們只考慮IP頭部結構,不考慮數據部分。在捕獲IP數據包后,可以通過指針把緩沖區(qū)的內容強制轉化為IP_HEADER數據結構。</p><p> IP_HEADER ip = *( IP_HEADER *)buffer;</p><p><
36、;b> 4.IP包的解析</b></p><p> 解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段 (或子字段)時,可以利用IP_HEADER的成員指教獲取。要解析長度不是9位倍數的字段(或子字段)時,可以利用C語言中的位移以及與、或操作完成。下面給出了通過IP_HEADER解析IP頭各個字段的代碼。</p><p> /*獲取版本字段*/<
37、/p><p> ip.Version>>4;</p><p> /*獲取頭部長度字段*/</p><p> ip.HdrLen & 0x0f;</p><p> /*獲取服務類型字段中的優(yōu)先級子域*/</p><p> ip.ServiceType>>5;</p>&
38、lt;p> /*獲取服務類型字段中的TOS子域*/</p><p> (IP.sERVICEtYPE>>1)&0X0F;</p><p> /*獲取總長度字段*/</p><p> ip.TotalLEN;</p><p> /*獲取標識字段*/</p><p><b>
39、 ip.ID;</b></p><p> /*解析標識字段*/</p><p> DF=(ip.Flags>>14) &0x01;</p><p> MF=(ip.Flags>>13) &0X01;</p><p> /*獲取分段偏移字段*/</p><p>
40、 ip.FragOff &0x1fff;</p><p> /*獲取生存時間字段*/</p><p> ip.TimeToLive;</p><p> /*獲取協議字段*/</p><p> ip.Protocol;</p><p> /*獲取頭校驗和字段*/</p><p>
41、; ip.HdrChksum;</p><p> /*解析源IP地址字段*/</p><p> inet_ntoa(*(in_addr*)&ip.SrcAddr;</p><p> /*解析目的的IP地址字段*/</p><p> inet_ntoa(*(in_addr*)&ip.DstAddr);</p>
42、;<p><b> 5.參考程序流程圖</b></p><p> 圖7-4給出一個供參考的程序流程圖。 </p><p><b> 五.實現過程</b></p><p> #include "stdafx.h"</p><p>
43、 #include "winsock2.h"</p><p> #include "ws2tcpip.h"</p><p> #include "stdio.h"</p><p> typedef struct _IP_HEADER</p><p><b> {&
44、lt;/b></p><p><b> union</b></p><p><b> {</b></p><p> BYTE Version;</p><p> BYTE HdrLen;</p><p><b> };</b></p
45、><p> BYTE ServiceType;</p><p> WORD TotalLen;</p><p><b> WORD ID;</b></p><p><b> union</b></p><p><b> {</b></p>
46、;<p> WORD Flags;</p><p> WORD Fragoff;</p><p><b> };</b></p><p> BYTE TimeToLive;</p><p> BYTE Protocol;</p><p> WORD HdrChksum;&
47、lt;/p><p> DWORD SrcAddr;</p><p> DWORD DstAddr;</p><p> BYTE Options;</p><p> }IP_HEADER;</p><p> void getVersion(BYTE b,BYTE & version)</p>
48、<p><b> {</b></p><p> version =b>>4;</p><p><b> }</b></p><p> void getIHL(BYTE b,BYTE & result)</p><p><b> {</b>
49、</p><p> result = (b & 0x0f) *4;</p><p><b> }</b></p><p> char * parseServiceType_getProcedence(BYTE b)</p><p><b> {</b></p><
50、p> switch(b>>5)</p><p><b> {</b></p><p><b> case 7:</b></p><p> return "Network Control";</p><p><b> break;</b&
51、gt;</p><p><b> case 6:</b></p><p> return "Internet work Control";</p><p><b> break;</b></p><p><b> case 5:</b></p&
52、gt;<p> return "CRITIC/ECP";</p><p><b> break;</b></p><p><b> case 4:</b></p><p> return "Flash Override";</p><p>
53、;<b> break;</b></p><p><b> case 3:</b></p><p> return "Falsh";</p><p><b> break;</b></p><p><b> case 2:</b&g
54、t;</p><p> return "Immediate";</p><p><b> break;</b></p><p><b> case 1:</b></p><p> return "Priority";</p><p&
55、gt;<b> break;</b></p><p><b> case 0:</b></p><p> return "Routine";</p><p><b> break;</b></p><p><b> default :&l
56、t;/b></p><p> return "Unknown"</p><p><b> }</b></p><p><b> }</b></p><p> char * parseServiceType_getTOS(BYTE b)</p><
57、p><b> {</b></p><p> b=(b>>1)&0x0f;</p><p><b> switch(b)</b></p><p><b> {</b></p><p><b> case 0:</b><
58、;/p><p> return "Normal service";</p><p><b> break;</b></p><p><b> case 1:</b></p><p> return "Minimize monetary cost";<
59、/p><p><b> break;</b></p><p><b> case 2:</b></p><p> return "Maximize reliability";</p><p><b> break;</b></p><
60、p><b> case 4:</b></p><p> return "Maximize throughput";</p><p><b> break;</b></p><p><b> case 8:</b></p><p> retur
61、n "Minimize delay";</p><p><b> break;</b></p><p><b> case 15:</b></p><p> return "Maximize security";</p><p><b> b
62、reak;</b></p><p><b> default:</b></p><p> return "Unknown";</p><p><b> }</b></p><p><b> }</b></p><p&g
63、t; void getFlags(WORD w,BYTE & DF, BYTE & MF)</p><p><b> {</b></p><p> DF=(w>>14)&0x01;</p><p> MF=(w>>13)&0x01;</p><p><
64、b> }</b></p><p> void getFragoff(WORD w,WORD & fragoff)</p><p><b> {</b></p><p> fragoff=w&0x1ffff;</p><p><b> }</b></p
65、><p> char * getProtocol(BYTE Protocol)</p><p><b> {</b></p><p> switch (Protocol)</p><p><b> {</b></p><p><b> case 1:</
66、b></p><p> return "ICMP";</p><p><b> case 2:</b></p><p> return "IGMP";</p><p><b> case 4:</b></p><p>
67、return "IP in IP ";</p><p><b> case 6:</b></p><p> return "TCP";</p><p><b> case 8:</b></p><p> return "EGP";&
68、lt;/p><p><b> case 17:</b></p><p> return "UPD";</p><p><b> case 41:</b></p><p> return "IPv6";</p><p><b&g
69、t; case 46:</b></p><p> return "OSPF";</p><p><b> default:</b></p><p> return "UNKNOWN";</p><p><b> }</b></p&g
70、t;<p><b> }</b></p><p> void ipparse(FILE * file,char *buffer)</p><p><b> {</b></p><p> IP_HEADER ip=*(IP_HEADER *)buffer;</p><p> f
71、seek(file,0,SEEK_END);</p><p> BYTE version;</p><p> getVersion(ip.Version,version);</p><p> fprintf(file,"版本=%d\r\n",version);</p><p> BYTE headerLen;<
72、;/p><p> getIHL(ip.HdrLen,headerLen);</p><p> fprintf(file,"頭長度=%d(BYTE)\r\n",headerLen);</p><p> fprintf(file,"服務類型=%s,%s\r\n");</p><p> parseServ
73、iceType_getProcedence(ip.ServiceType);</p><p> parseServiceType_getTOS(ip.ServiceType);</p><p> fprintf(file,"數據報長度=%d(BYTE)\r\n",ip.TotalLen);</p><p> fprintf(file,&qu
74、ot;數據報ID=%d\r\n",ip.ID);</p><p> BYTE DF,MF;</p><p> getFlags(ip.Flags,DF,MF);</p><p> fprintf(file,"分段標志 DF=%d,MF=%d\r\n",DF,MF);</p><p> WORD fragO
75、ff;</p><p> getFragOff(ip.FragOff,fragOff);</p><p> fprintf(file,"分段偏移值=%d\r\n",fragOff);</p><p> fprintf(file," 生存期=%d(hops)\r\n",ip.TimeToLive);</p>
76、<p> fprintf(file,"協議=%s\r\n",getProtocol(ip.Protocol));</p><p> fprintf(file,"頭校驗和=0x%0x\r\n",ip.HdrChksum);</p><p> fprintf(file,"源IP地址=%s\r\n",inet-ntoa(
77、*(in-addr*)&ip.SrcAddr));</p><p> fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in-addr*)&ip.DstAddr));</p><p> fprintf(file,"__________________________________\r\n");&l
78、t;/p><p><b> }</b></p><p> int main(int argc,char *argv[])</p><p><b> {</b></p><p> if(argc!=2)</p><p><b> {</b></
79、p><p> printf("usage error!\n");</p><p> return -1;</p><p><b> }</b></p><p> FILE * file;</p><p> if((file=foopen(argv[1],"wb+
80、"))==NULL)</p><p><b> {</b></p><p> printf("fail to open file %s",argv{1});</p><p> return -1;</p><p><b> }</b></p>&l
81、t;p> WSADATA wsData;</p><p> if(WSAStartup(MAKEWORD(2,2),$WSdATA)!=0)</p><p><b> {</b></p><p> PRINTF("WSAStartup FAILED!\n");</p><p> ret
82、urn -1;</p><p><b> }</b></p><p> SOCKET sock;</p><p> if((sock=socket(AF_INET,SOCK_RAW,ippROTO_IP))==INVALID_SOCKET)</p><p><b> {</b></p&
83、gt;<p> PRINTF("CREATE socket failed!\n");</p><p> return -1;</p><p><b> }</b></p><p> BOOL flag=TRUE;</p><p> IF(setsockopt(sock,IPPR
84、OTO_IP,IP_HDRINCL,(CHAR*)&FLAG,sizeof(flag))==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("setsockopt failed!\n");</p><p> return -1;</p><p
85、><b> }</b></p><p> char hostName[128];</p><p> if(gethostname(hostName,100)==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("gethost
86、name failed!\n");</p><p> return -1;</p><p><b> }</b></p><p> hostent * pHostIP;</p><p> if(pHostIP=gethostbyname(hostName))==NULL)</p><
87、p><b> { </b></p><p> printf("gethostbyname failed!\n");</p><p> return -1;</p><p><b> }</b></p><p> sockaddr_in addr_in;</p
88、><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=htone(6000);</p><p> if(bind(sock,(PSOCKADDR
89、)&addr_in,sizeof(addr_in))==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("bind failed");</p><p> return -1;</p><p><b> }</b>&
90、lt;/p><p> DWORD dwValue=1;</p><p> #define IO_RCVALL_WSAIOW(IOC_VENDOR,1)</p><p> DWORD dwBufferLen[10];</p><p> DWORD dwBufferInLen=1;</p><p> DWORD dw
91、BytesReturned=0;</p><p> if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),</p><p> &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==</p><p>
92、; NULL,NULL)==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("icotlsocket failed\n");</p><p> return -1;</p><p><b> }</b></p>
93、;<p> #define BUFFER_SIZE 65535</p><p> char buffer[BUFFER_SIZE];</p><p> printf("開始解析\n\n");</p><p> while(true)</p><p><b> {</b><
94、/p><p> int size=recv(sock,buffer,BUFFER_SIZE,0);</p><p> if(size>0)</p><p><b> { </b></p><p> ipparse(stdout,buffer);</p><p> ipparse(fil
95、e,buffer); </p><p><b> }</b></p><p><b> }</b></p><p> fclose(file);</p><p><b> return 0:</b></p><p><b> }&l
96、t;/b></p><p><b> 六.程序流程圖:</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> 七.相關擴展</b></p><p> 本程序設計
97、也可以利用Winpcap完成,部分核心代碼的簡略提示如下。</p><p> 獲取所有存在的網絡設備的鏈表。</p><p> Pcap_if_t *alldevs; //網絡設備結構鏈表</p><p> Char errbuf[PCAP_ERRBUF_SIZE]; //錯誤信息</p><p> /*所有網絡設備
98、的信息以鏈表形式存在alldevs中*/</p><p> pcap_findalldevs(&alldevs,errbuf);</p><p> 2) 從鏈表中選擇物理Ethernet卡后,用混雜模式打開,調用的函數為pcap_open_live(const char*device,int snaplen,int promisc,int to_ms,char*errbuf).
99、在這個函數中,第一個參數為要打開的設備名稱,這里是Ethernet卡,可以從設備鏈表alldevs中選出。第二個參數應為捕獲的數據包長度,填入65535以保證在鏈路層的整個數據包都被捕獲。第三個參數為打開模式,填入1表明用混雜模式打開網卡。最后兩個參數本別為讀入超時的時間和保存錯誤信息。</p><p><b> 編譯、設置過濾器。</b></p><p> ch
100、ar packet_filter[]=”ip”;</p><p> pcap_compile(adhandle,&fcode,packet_filter,1,netmask);//編譯過濾器</p><p> pcap_setfilter(adhandle,&fcode); //設置過濾器</p><p> adhandle參數為
101、網卡描述符,fcode參數是一個BPF偽匯編程序,packet_filter參數用于設置的過濾規(guī)則,在這里我們只需要捕獲IP包。</p><p> 4) 可利用pcap_loop函數捕獲數據包。對于捕獲的數據包,去掉數據鏈路層的14B的頭部后才是真正的IP包信息。利用winpcap編程和利用socket編程在處理IP包上并沒有太大區(qū)別,我們依然可以使用7。4節(jié)中采用的數據結構IP——HEADER來保存、解析IP
102、頭部信息。</p><p><b> 八.實習體會</b></p><p> 通過這次實驗,了解到關于計算機網絡數據傳送及處理過程中,軟件起到了巨大的作用。熟悉了VC++在計算機網絡方面的應用,是一次難得的機會。</p><p> 同學們的默鍥配合和合作精神是實驗成功的必要條件,而謹慎對待事物的態(tài)度是成功的關鍵。</p>&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網絡協議分析課程設計---解析ip數據包
- 解析arp數據包課程設計
- 計算機網絡課程設計-- 解析ip數據包
- 計算機網絡課程設計---ip數據包解析報告
- 網絡課程設計--發(fā)送tcp數據包
- 計算機網絡課程設計---監(jiān)控ip數據包流量
- 監(jiān)控ip數據包流量
- 解析arp數據包-計算機網絡課程設計
- ip數據包的捕獲與分析
- 計算機網絡課程設計tcp數據包
- IP數據包分類算法的研究.pdf
- 計算機網絡課程設計---基于wireshark的網絡數據包內容解析
- 計算機網絡課程設計---網絡協議數據包
- IP地址查找和數據包分類算法研究.pdf
- 《網絡編程與協議分析》課程設計--網絡數據包抓取與分析軟件
- IP網絡數據包流部分特征分析工具的設計與實現.pdf
- rfc877_ip 數據包通過公共數據網絡的傳輸標準
- 高速網絡數據包解析器設計與FPGA實現.pdf
- 畢業(yè)論文--- 局域網的ip數據包監(jiān)控分析軟件與設計
- rfc1088_ip 數據包傳輸通過netbios網絡的標準
評論
0/150
提交評論