計算機網(wǎng)絡_課程設計_IP數(shù)據(jù)包解析(I)_第1頁
計算機網(wǎng)絡_課程設計_IP數(shù)據(jù)包解析(I)_第2頁
計算機網(wǎng)絡_課程設計_IP數(shù)據(jù)包解析(I)_第3頁
計算機網(wǎng)絡_課程設計_IP數(shù)據(jù)包解析(I)_第4頁
計算機網(wǎng)絡_課程設計_IP數(shù)據(jù)包解析(I)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、課設名稱:IP數(shù)據(jù)包解析班 級:學 號:姓 名:指導老師:目錄 TOC o 1-3 h z u HYPERLINK l _Toc327820939 1.課程設計目的 PAGEREF _Toc327820939 h 1 HYPERLINK l _Toc327820940 2.課程設計要求 PAGEREF _Toc327820940 h 1 HYPERLINK l _Toc327820941 3.程序設計分析 PAGEREF _Toc327820941 h 1 HYPERLINK l _Toc327820942 3.1 網(wǎng)卡設置 PAGEREF _Toc327820942 h 1 HYPERLIN

2、K l _Toc327820943 3.2 使用套接字 PAGEREF _Toc327820943 h 2 HYPERLINK l _Toc327820944 3.2.2 接收數(shù)據(jù)包 PAGEREF _Toc327820944 h 2 HYPERLINK l _Toc327820945 3.3 定義IP頭部的數(shù)據(jù)結構 PAGEREF _Toc327820945 h 3 HYPERLINK l _Toc327820946 3.4 IP包的解析 PAGEREF _Toc327820946 h 3 HYPERLINK l _Toc327820947 3.5 協(xié)議的定義 PAGEREF _Toc327

3、820947 h 4 HYPERLINK l _Toc327820948 3.6捕獲處理 PAGEREF _Toc327820948 h 4 HYPERLINK l _Toc327820949 4.運行結果 PAGEREF _Toc327820949 h 5 HYPERLINK l _Toc327820951 5.總結 PAGEREF _Toc327820951 h 5 HYPERLINK l _Toc327820953 6.源程序代碼 PAGEREF _Toc327820953 h 61.課程設計目的 本課程設計的目的就是設計一個捕獲并解析IP數(shù)據(jù)包的程序,并根據(jù)這個程序,說明IP數(shù)據(jù)包的結

4、構及IP協(xié)議的相關問題,從而對IP層的工作原理有更好的理解和認識。2.課程設計要求 本設計的目標是捕獲網(wǎng)絡中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結果顯示在標準輸出上,并同時寫入日志文件。程序的具體要求如下:1)以命令行形式運行:ipparse logfile,其中ipparse是程序名, 而logfile則代表記錄結果的日志文件。 2)在標準輸出和日志文件中寫入捕獲的IP包的版本、頭長度、服務類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標識、分段標志、分段偏移值、生存時間、上層協(xié)議類型、頭校驗和、源IP地址和目的IP地址等內(nèi)容。3)當程序接收到鍵盤輸入Ctrl+C時退出3.程序設計分析3.1 網(wǎng)卡設置 為了獲取網(wǎng)

5、絡中的IP數(shù)據(jù)包,必須對網(wǎng)卡進行編程,在這里使用套接字(socket)進行編程。但是,在通常情況下,網(wǎng)絡通信的套接字程序只能響應與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式發(fā)出的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達網(wǎng)絡接口,但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡接口在騅投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取與自己無關的數(shù)據(jù)包。我們要想獲取網(wǎng)絡設備的所有數(shù)據(jù)包,就是需要將網(wǎng)卡設置為混雜模式。3.2 使用套接字 套接字分為三種,即流套接字(Stream socket)、數(shù)據(jù)報套接字(Datagram Socket)和原始套接字(Raw Socket)。要進行IP層數(shù)據(jù)包的接收和

6、發(fā)送,應使用原始套接字。創(chuàng)建原始套接字的代碼如下: Socket sock: Sock=wsasocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped):本設計不用考慮超時情況。創(chuàng)建套接后,IP頭就會包含在接收數(shù)據(jù)包中。然后,我可以設置IP頭操作選項,調(diào)用setsockopt函數(shù)。其中flag設置為true,并設定IP-HDRINCL選項,表明用戶可以親自對IP頭進行處理。最后使用bind()函數(shù)將socket綁定到本地網(wǎng)卡上。綁定網(wǎng)卡后,需用WSAIoctl()函數(shù)把網(wǎng)卡設置為混雜模式,使網(wǎng)卡能夠接收所有的網(wǎng)絡數(shù)據(jù)。如果接收的

7、數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收的數(shù)據(jù)就拷貝到套接字中,因此,網(wǎng)卡就可以接收所有經(jīng)過的IP包。3.2.2 接收數(shù)據(jù)包 在程序中可使用recv()函數(shù)接收經(jīng)過的IP包。該函數(shù)有四個參數(shù),第一個參數(shù)接收操作所用的套接字描述符;第二個參數(shù)接收緩沖區(qū)的地址;第三個參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個參數(shù)是一個附加標志,如果對所發(fā)送的數(shù)據(jù)沒特殊要求,直接設為0。因為IP數(shù)據(jù)包的最大長度是65535B,因此緩沖區(qū)的大小不能小于65535B。設置緩沖區(qū)后,可利用循環(huán)來反復監(jiān)聽接收IP包,用recv()函數(shù)實現(xiàn)接收功能。3.3 定義IP頭部的數(shù)據(jù)結構程序需要定義一個數(shù)據(jù)結構表

8、示IP頭部。其代碼如下:struct IP_HEADERunsigned short ip_version, /*IP的版本號 */ip_hdr_len; /*IP包頭的長度*/ip_tos; /*IP包的服務類型*/ip_total_len; /*IP包的總長度*/ip_id; /*IP包的分段標識*/ip_flags; /*IP包的分段標志*/ip_frag_offset; /*IP包的分段偏移*/ip_ttl; /*IP包的生存時間*/ip_proto; /*IP包的高層協(xié)議*/ip_hdr_chksum; /*IP包的校驗和*/struct IPADDRESS ip_src_addr;

9、 /*IP包的源IP地址*/ip_dest_addr; /*IP包的目的IP地址*/ipheader;3.4 IP包的解析 解析IP包的字段有兩種策略。針對長度為8位、16位和32位的字段(或子字段)時,可以利用IP-HEADER的成員直接獲取。要解析長度不是8位倍數(shù)的字段(或子字段)時,可以利用C語言中的移位以人、及與、或操作完成。3.5 協(xié)議的定義(包含相應的頭文件#include #include):DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包*/dwProtocol=IPPROTO_IP; /*協(xié)議類型為IP*/3.6捕獲處理1.加載 Win

10、sock;2.創(chuàng)建一個接收原始IP包的socket連接;3.綁定到一個接口;4.進行WSAIoctl設置,接收所有的IP數(shù)據(jù)包。代碼如下:if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval),NULL, 0, &dwBytesRet, NULL, NULL) = SOCKET_ERROR)5.接著設定一個線程進行捕獲:(1)創(chuàng)建一個接收IP包的鏈表頭;(2)設置一個標識,為真,則不斷進行IP包的捕獲;(3)建立一個新的結點,將捕獲的數(shù)據(jù)包加入到該結點;(4)如果鏈表的長度達到指定的長度,創(chuàng)建一個線程對該鏈表的IP包進行解析;再設置一個

11、在IP數(shù)據(jù)包鏈表不足給定的長度,而又中止IP捕獲時,對鏈表的處理;(5)為下一個IP包鏈表創(chuàng)建一個鏈表頭。6.建立一個進行IP包解析并顯示的線程,進行解析IP數(shù)據(jù)包,然后顯示IP數(shù)據(jù)包。4.運行結果截獲IP數(shù)據(jù)包程序運行結果如下:5.總結 在本次課程設計中,通過多次上機的實踐,充分利用所學的計算機網(wǎng)絡以及socket編程與C語言編程的知識,并上網(wǎng)搜索一部分相當資料,粗略設計出該程序。 通過本次課程設計,充分運用了所學的計算機網(wǎng)絡知識,設計出了如何解析IP數(shù)據(jù)包,從而更加深刻的了解到了IP數(shù)據(jù)包的結構及IP協(xié)議的相關問題,從而對IP層的工作原理有更好的理解和認識。 在課程設計的過程也碰到的不少問

12、題。例如:對IP數(shù)據(jù)包的結構不了解、IP層工作原理也不熟悉、C語言編程基礎差等一系列問題。讓我認識到了自己的很大不足,在以后的學習過程中還將努力提高。6.源程序代碼#include winsock2.h#include ws2tcpip.h#include iostream.h#include stdio.h#pragma comment(lib, ws2_32.lib)#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535/* 定義IP頭部數(shù)據(jù)結構 */typedef struct _IP_HEADERunionBYT

13、E Version; /版本(前4位)BYTE HdrLen; /報頭標長(后四位),IP頭長度;BYTE ServiceType; /服務類型WORD TotalLen; /總長度WORD ID; /標識unionWORD Flags;WORD FragOff;BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;IP_HEADER;/逐位解析IP頭中的信息,獲取版本號void getVersion(BYTE b,BYTE &version)version = b4;void

14、 getIHL(BYTE b,BYTE &result)result = (b & 0 x0f) *4;/解析服務類型char * parseServiceType_getProcedence(BYTE b)switch(b5)case 7:return Network Control;case 6:return Internet work Control;case 5:return CRITIC/ECP;case 4:return Flash Override;case 3:return Falsh;case 2:return Immediate;case 1:return Priority

15、;case 0:return Routine;default:return Unknown;char * parseServiceType_getTOS(BYTE b)b=(b1)&0 x0f;switch(b)case 0:return Normal service; case 1:return Minimize monetary cost;case 2:return Maximize reliability;case 4:return Maximize throughput;case 8:return Minimize delay;case 15:return Maximize secur

16、ity;default:return Unknown;/* 獲取禁止分片標志和分片標志 */void getFlags(WORD w,BYTE &DF, BYTE &MF)DF=(w14)&0 x01;MF=(w13)&0 x01;/* 獲取分片偏移量 */void getFragoff(WORD w,WORD &fragoff)fragoff=w&0 x1ffff;/獲取協(xié)議char * getProtocol(BYTE Protocol)switch (Protocol)case 1: return ICMP;case 2:return IGMP;case 3:return GGP;cas

17、e 4:return IP in IP ;case 6:return TCP;case 8:return EGP;case 17:return UDP;case 41:return IPv6;case 46:return OSPF;default:return UNKNOWN;/* 解析IP數(shù)據(jù)包 */void ipparse(FILE * file,char *buffer)IP_HEADER ip = *(IP_HEADER *)buffer;fseek(file,0,SEEK_END);BYTE version;getVersion(ip.Version,version);fprintf

18、(file,版本=IPV%drn,version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,頭長度=%d(BYTE)rn,headerLen);fprintf(file,服務類型=%s,%srn,parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType);fprintf(file,數(shù)據(jù)報長度=%d(BYTE)rn,ip.TotalLen);fprintf(file,數(shù)據(jù)報ID=%drn,ip.ID);/* DF

19、表示禁止分片標志,MF表示分片標記 */BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,分段標志 DF=%d,MF=%drn,DF,MF);WORD fragOff;getFragoff(ip.FragOff,fragOff);fprintf(file,分段偏移值=%drn,fragOff);fprintf(file,生存期=%d(hops)rn,ip.TimeToLive);fprintf(file,協(xié)議=%srn,getProtocol(ip.Protocol);fprintf(file,頭校驗和=0 x%0 xrn,ip.HdrChksu

20、m);fprintf(file,源IP地址=%srn,inet_ntoa(*(in_addr*)&ip.SrcAddr);fprintf(file,目的IP地址=%srn,inet_ntoa(*(in_addr*)&ip.DstAddr);fprintf(file,_rn);/* 程序入口 */int main(int argc,char *argv)/* cmd參數(shù) */if(argc!=2)printf(usage error!n);return -1;FILE *file;/* 以讀寫的方式建立一個文本文件logfile.txt */if(file=fopen(argv1,w+)=NUL

21、L)printf(fail to open file %s,logfile.txt);return -1;WSAData wsData;/* 啟動2.2版本的Socket,并將Socket版本信息保存到wsData中 */if(WSAStartup(MAKEWORD(2,2),&wsData)!=0)printf(WSA startup failed!n);return -1;fprintf(file,Socket初始化.rn);fprintf(file,=rn);fprintf(file,描述:%srn,wsData.szDescription);fprintf(file,狀態(tài):%srn,w

22、sData.szSystemStatus);fprintf(file,=rn);SOCKET sock;/* 創(chuàng)建原始套接字 */if(sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)=INVALID_SOCKET)printf(Can not create socket!n);return -1;BOOL flag=true;/* 設置IP頭操作選項 */if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag)=SOCKET_ERROR)printf(setsockopt failed

23、!n);return -1;char hostName128;/* 獲取本地主機名 */if(gethostname(hostName,100)=SOCKET_ERROR)printf(gethostname failed!n);return -1;hostent *pHostIP;/* 根據(jù)主機名獲取主機信息 */if(pHostIP=gethostbyname(hostName)=NULL)printf(gethostbyname failed!n);return -1;printf(Hostname: %srn,pHostIP-h_name);printf(IPAddress: %srn,inet_ntoa(*(struct in_addr *)pHostIP-h_addr);/* 封裝IP地址信息 */sockad

溫馨提示

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

評論

0/150

提交評論