




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1 .需求分析 12 .總體設(shè)計 13 .詳細(xì)設(shè)計 24 .源程序 65 .運行結(jié)果 126 .實驗總結(jié) 147 .參考資料 14一.需求分析本設(shè)計的目標(biāo)是捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容, 將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時寫入日志文件。程序的具體要求如下:1)以命令行形式運行:hhb logfile ,其中hhb是程序名,而 logfile 則代表記錄結(jié)果的日志文件。2 )在標(biāo)準(zhǔn)輸出和日志文件中寫入捕獲的IP包的版本、頭長度、服 務(wù)類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標(biāo)識、分段標(biāo)志、分段偏移值、生存 時間、上層協(xié)議類型、頭校驗和、源IP地址和目的IP地址等內(nèi)容。3)當(dāng)程序接收到鍵盤輸入 Ctrl
2、+C時退出二.總體設(shè)計為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對網(wǎng)卡進(jìn)行編程,我們使用 套接字進(jìn)行編程。?使用套接字?接收數(shù)據(jù)包?定義IP頭部的數(shù)據(jù)結(jié)構(gòu)? IP包的解析程序流程圖:三.詳細(xì)設(shè)計3.1 網(wǎng)卡設(shè)置為了獲取網(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ù)包,
3、就是需要將網(wǎng)卡設(shè)置為 混雜模式。3.2 使用套接字套接字分為三種,即流套接字(Stream socket)、數(shù)據(jù)報套接字(Datagram Socket)和原始套接字(Raw Socket)。要進(jìn)行IP層數(shù)據(jù)包的接收和發(fā)送,應(yīng)使用原始套 接字。創(chuàng)建原始套接字的代碼如下:Socket sock:Sock=wsasocket(afjnet,sock_raw,ipproto-ip,null,0,wsa-f lag-overlapped):本設(shè)計不用考慮超時情況。創(chuàng)建套接后,IP頭就會包含在接收數(shù)據(jù)包中。然后,我可以設(shè)置IP頭操作選項, 調(diào)用setsockopt函數(shù)。其中flag設(shè)置為true,并設(shè)定
4、IP-HDRINCL選項,表明 用戶可以親自對IP頭進(jìn)行處理。最后使用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包。3.2.2接收數(shù)據(jù)包在程序中可使用recv()函數(shù)接收經(jīng)過的IP包。該函數(shù)有四個參數(shù),第一個 參數(shù)接收操作所用的套接字描述符;第二個參數(shù)接收緩沖區(qū)的地址;第三個參 數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個參數(shù)是一個附加標(biāo)志,如果對所發(fā)送的數(shù)據(jù)沒特殊要求
5、,直接設(shè)為00因為IP數(shù)據(jù)包的最大長度是65535B,因此緩沖區(qū)的大小不能小于 65535R設(shè)置緩沖區(qū)后,可利用循環(huán)來反 復(fù)監(jiān)聽接收IP包,用recv()函數(shù)實現(xiàn)接收功能。3.3 定義IP頭部的數(shù)據(jù)結(jié)構(gòu)程序需要定義一個數(shù)據(jù)結(jié)構(gòu)表示IP頭部。其代碼如下:struct IP_HEADER unsigned short ip_version, /*IP的版本號 */ip_hdr_len ;/*IP 包頭的長度 */ip_tos ;/*IP 包的服務(wù)類型*/ip_total_len ;/*IP 包的總長度 */ip_id ;/*IP包的分段標(biāo)識*/ip_flags ;/*IP 包的分段標(biāo)志*/ip_f
6、rag_offset ; /*IP 包的分段偏移 */ip_ttl ;/*IP包的生存時間*/ip_proto ;/*IP 包的高層協(xié)議*/ip_hdr_chksum;/*IP 包的校驗和 */struct IPADDRESS ip_src_addr ; /*IP 包的源 IP 地址*/ip_dest_addr ;/*IP 包的目的 IP 地址*/ipheader;3.4 IP包的解析解析IP包的字段有兩種策略。針對長度為 8位、16位和32位的字段(或子 字段)時,可以利用IP-HEADER勺成員直接獲取。要解析長度不是 8位倍數(shù)的字 段(或子字段)時,可以利用C語言中的移位以人、及與、或操
7、作完成。3.5 協(xié)議的定義(包含相應(yīng)的頭文件#include #include ):DWORD dwIoControlCode=SIO_RCVALL,股收所有的 IP 包*/dwProtocol=IPPROTO_IP;/* 協(xié)議類型為 IP*/3.6 捕獲處理1 .加載 Winsock ;2 .創(chuàng)建一個接收原始IP包的socket連接;3 .綁定到一個接口;4 .進(jìn)行WSAIoctl設(shè)置,接收所有的IP數(shù)據(jù)包。代碼如下:if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval),NULL, 0, &dwBytesRet, NULL, NUL
8、L) = SOCKET_ERROR)5 .接著設(shè)定一個線程進(jìn)行捕獲:(1)創(chuàng)建一個接收IP包的鏈表頭;(2)設(shè)置一個標(biāo)識,為真,則不斷進(jìn)行IP包的捕獲;(3)建立一個新的結(jié)點,將捕獲的數(shù)據(jù)包加入到該結(jié)點;(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ù)包,然后顯示IP 數(shù)據(jù)包。四.源程序#include#include#include#include#include #pragma commen
9、t(lib,ws2_32) 指定連接到網(wǎng)絡(luò)應(yīng)用和internet#define IO_RCV ALL _WSAIOW(IOC_VENDOR,1) typedef struct IP_HEADunion 定義聯(lián)合unsigned char Version;unsigned char HeadLen;unsigned char ServiceType;unsigned short TotalLen;unsigned short Identifier;unionunsigned short Flags;unsigned short FragOffset;unsigned char TimeToLiv
10、e;unsigned char Protocol;unsigned short HeadChecksum;unsigned int SourceAddr;unsigned int DestinAddr;unsigned char Options;ip_head; / 定義 IP 頭部的數(shù)據(jù)結(jié)構(gòu)void main(int argc,char *argv)using namespace std;ofstream outfile(D:logfile.txt,ios:out);if(argc!=2)coutendl 請以下格式輸入命令行:PackParse packet_sumendl;return;
11、WSADATA WSAData;if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0)coutendlWSASTartup 初始化失敗endl;return;SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); /三個參分別為通信發(fā)生的區(qū)字段,套接字的類型,與IP 協(xié)議if(sock=INV ALID_SOCKET)coutendl 創(chuàng)建 Socket 失敗 !endl;closesocket(sock);WSACleanup();BOOL flag=TRUE;if(setsockopt(sock,IPPROTO_IP,
12、IP_HDRINCL,(char *) &flag,sizeof(flag)=SOCKET_ERROR)coutendlsetsockopt 操作失敗 :WSAGetLastError()endl;closesocket(sock);WSACleanup();char hostName128;/ 獲取主機(jī)名if(gethostname(hostName,100)=SOCKET_ERROR)coutendlgethostname 操作失敗 :WSAGetLastError()endl;closesocket(sock);WSACleanup();hostent *pHostIP; / 獲取本地
13、IPif(pHostIP=gethostbyname(hostName)=NULL)coutendlgethostbyname 操作失敗 :WSAGetLastError()h_addr_list0;if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr)=SOCKET_ERROR)coutendlbind 操作失敗 :WSAGetLastError()endl;closesocket(sock); / 綁定網(wǎng)卡WSACleanup();DWORD dwBufferLen10;DWORD dwBufferInLen=1;DWORD dwBytes
14、Returned=0;if(WSAIoctl(sock , IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen)&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)=SOCKET_ERROR)coutendlWSAIoctl 操作失敗 :WSAGetLastError()endl;closesocket(sock); / 將網(wǎng)卡設(shè)為混雜模式,以接受所有數(shù)據(jù)WSACleanup();coutendl 開始解析 IP 包 :endl;char buffer65535; / 設(shè)置緩沖區(qū)i
15、nt packsum=atoi(argv1); / 字符串轉(zhuǎn)換為整形for(int i=0;i0) /四個參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)大小,附加標(biāo)志(ip_head ip=*(ip_head *)buffer;coutendl;cout版本:4)endl; / 獲取頭部長度字段cout頭部長度:(ip.HeadLen &0x0f)*4)endl; /獲取頭部長度字段cout 服 務(wù) 類 型:Priority5),Service1)&0x0f)endl; / 優(yōu)先級子域和 TOS 子域cout總長度:ip.TotalLenendl;/ 獲取總長度字段cout標(biāo)識符:ip.Iden
16、tifierendl;/ 獲取標(biāo)識字段cout標(biāo)志位:15)&0x01),DF=14)&0x01),Mf=13)&0x01)endl;/獲得標(biāo)志字段cout片偏移:(ip.FragOffset&0x1fff)endl; / 獲取分段偏移字段cout生存周期:(int)ip.TimeToLiveendl;/ 獲取生存時間字段cout協(xié)議:Protocol(int)ip.Protocolendl; / 獲取協(xié)議字段cout頭部校驗和:ip.HeadChecksumendl; /獲取頭校驗和字段cout原地址:inet_ntoa(*(in_addr *)&ip.SourceAddr)endl;/ 獲
17、取源 IP 地址字段cout目的 IP 地址:inet_ntoa(*(in_addr *)&ip.DestinAddr)endl; / 獲取目的 IP 地址字段endl;outfile版本:4)endl;outfile頭部長度:(ip.HeadLen &0x0f)*4)endl;outfile 服 務(wù) 類 型:Priority5),Service1)&0x0f)endl;outfile總長度:ip.TotalLenendl;outfile標(biāo)識符:ip.Identifierendl;outfile標(biāo)志位:15)&0x01),DF=14)&0x01),Mf=13)&0x01)endl;outfile片偏移:(ip.FragOffset&0x1fff)endl;outfile生存周期:(int)ip.TimeToLiveendl;outfile協(xié)議:Protocol(int)ip.Protocolendl;outfile頭部校驗和:ip.HeadChecksumendl;outfile原地址:inet_ntoa(*(in_addr *
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度旅游景區(qū)保安臨時工臨時服務(wù)合同
- 二零二五年度醫(yī)療貸款擔(dān)保人免責(zé)服務(wù)合同
- 二零二五年度旅游產(chǎn)品未簽合同消費者權(quán)益保障合同
- 2025年度智能制造行業(yè)勞動合同解除及保密協(xié)議模板
- 2025年度購物中心店面轉(zhuǎn)租與租賃期滿續(xù)約合同
- 天津市2025年度租賃房屋裝修與維修責(zé)任協(xié)議
- 二零二五年度美容院轉(zhuǎn)讓合同附帶技術(shù)培訓(xùn)與售后服務(wù)
- 二零二五年度專業(yè)培訓(xùn)機(jī)構(gòu)教師團(tuán)隊建設(shè)與培養(yǎng)合同
- 2025年遂寧考從業(yè)資格證貨運試題
- 2025年銀川貨運從業(yè)資格證考試題目及答案解析
- Adobe-Illustrator-(Ai)基礎(chǔ)教程
- 沒頭腦和不高興-竇桂梅.精選優(yōu)秀PPT課件
- 鋼棧橋計算書(excel版)
- 租賃合同審批表
- 事業(yè)單位綜合基礎(chǔ)知識考試題庫 綜合基礎(chǔ)知識考試題庫.doc
- 巖石堅固性和穩(wěn)定性分級表
- 譯林初中英語教材目錄
- 律師事務(wù)所函[]第號
- 物業(yè)交付后工程維修工作機(jī)制
- 農(nóng)作物病蟲害專業(yè)化統(tǒng)防統(tǒng)治管理辦法
- 新形勢下如何做一名合格的鄉(xiāng)鎮(zhèn)干部之我見
評論
0/150
提交評論