數(shù)據(jù)通信與網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)踐報(bào)告 解析IP數(shù)據(jù)包_第1頁(yè)
數(shù)據(jù)通信與網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)踐報(bào)告 解析IP數(shù)據(jù)包_第2頁(yè)
數(shù)據(jù)通信與網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)踐報(bào)告 解析IP數(shù)據(jù)包_第3頁(yè)
數(shù)據(jù)通信與網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)踐報(bào)告 解析IP數(shù)據(jù)包_第4頁(yè)
數(shù)據(jù)通信與網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)踐報(bào)告 解析IP數(shù)據(jù)包_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、數(shù)據(jù)通信與網(wǎng)絡(luò)課程設(shè)計(jì)實(shí)踐報(bào)告題 目: 解析ip數(shù)據(jù)包 姓 名: 學(xué) 院: 信息科技學(xué)院 專 業(yè): 計(jì)算機(jī)科學(xué)技術(shù)系 班 級(jí): 計(jì)科73 學(xué) 號(hào): 1927303 指導(dǎo)教師: 職稱: 2010 年9月 15日摘要:互聯(lián)網(wǎng)絡(luò)層是tcp/ip協(xié)議參考模型中的關(guān)鍵部分.ip協(xié)議把傳輸層送來(lái)的消息組裝成ip數(shù)據(jù)包,并把ip數(shù)據(jù)包傳送給數(shù)據(jù)鏈層.ip協(xié)議在tcp/ip協(xié)議族中處于核心地位,ip協(xié)議制定了統(tǒng)一的ip數(shù)據(jù)包格式,以消除個(gè)通信子網(wǎng)中的差異,從而為信息發(fā)送方和接收方提供了透明的傳輸通道。本程序使用套接字socket編程,將網(wǎng)受流經(jīng)網(wǎng)卡的所有類(lèi)型的數(shù)據(jù)包。首先,初始化套接字,然后監(jiān)聽(tīng)數(shù)據(jù)包,解析數(shù)

2、據(jù)包。關(guān)鍵字:tcp/ip協(xié)議,數(shù)據(jù)包,套接字,解析一 設(shè)計(jì)內(nèi)容及任務(wù)利用c/c+/vc/vb/java語(yǔ)言,根據(jù)所學(xué)知識(shí),設(shè)計(jì)程序,功能為捕獲網(wǎng)絡(luò)中的ip數(shù)據(jù)包,接續(xù)數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時(shí)寫(xiě)入日志文件。具體:1. 以命令行形式運(yùn)行,ipparse logfile,其中ipparse是程序命,而logfile則代表記錄記過(guò)的日志文件。2. 在標(biāo)準(zhǔn)輸出和日志文件中寫(xiě)入捕獲的ip包的版本、頭長(zhǎng)度、服務(wù)類(lèi)型、數(shù)據(jù)包總長(zhǎng)度、數(shù)據(jù)包標(biāo)識(shí)、分段標(biāo)志、分段偏移值、生存時(shí)間、上層協(xié)議類(lèi)型、頭校驗(yàn)和、源ip地址和目的ip地址等內(nèi)容。3. 當(dāng)程序接收到鍵盤(pán)輸入ctrl+c時(shí)推出。二 設(shè)計(jì)思想

3、ip數(shù)據(jù)報(bào)的格式說(shuō)明ip協(xié)議都具有什么功能。其首部,版本目前廣泛使用的版本號(hào)為4;首部長(zhǎng)度站4bit;服務(wù)類(lèi)型占8bit,其中服務(wù)類(lèi)型tos子域占4位,優(yōu)先級(jí)子域占3位,另一位為保留位;總長(zhǎng)度字段為2b,ip數(shù)據(jù)包的最大長(zhǎng)度是65535b;標(biāo)識(shí)占16bit,它是一個(gè)計(jì)數(shù)器,用來(lái)產(chǎn)生數(shù)據(jù)報(bào)的標(biāo)識(shí);標(biāo)志占3bit,其中最低為為mf,mf=1時(shí)為后面“還有分片”,mf=0表示這是數(shù)據(jù)報(bào)片中的最后一個(gè),df=0時(shí),表示允許分片;片偏移以8個(gè)字節(jié)為偏移單位;生存時(shí)間字段記為ttl,單位為秒;協(xié)議段占8bit,用于指出次數(shù)據(jù)是使用何種協(xié)議,典型的協(xié)議號(hào)有6:tcp,17:udp,1:icmp。本程序使用套

4、接字socket編程,將網(wǎng)受流經(jīng)網(wǎng)卡的所有類(lèi)型的數(shù)據(jù)包。首先,初始化套接字,然后監(jiān)聽(tīng)數(shù)據(jù)包,解析數(shù)據(jù)包??ㄔO(shè)為能夠接socket sock=socket(af_inet,sock_raw,ipproto_ip)用來(lái)創(chuàng)建套接字,其參數(shù)為通信發(fā)生的區(qū)字段和套接字的類(lèi)型。wsaioctl(sock , io_rcvall ,&dwbufferinlen , sizeof(dwbufferinlen)函數(shù)用來(lái)把網(wǎng)卡設(shè)置為混雜模式。recv(sock,buffer,65535,0)函數(shù)用來(lái)接收經(jīng)過(guò)的ip包,其參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)的大小。typedef struct ip_head

5、ip_head;用來(lái)定義ip頭部數(shù)據(jù)。setsockopt(sock,ipproto_ip,ip_hdrincl,(char *)函數(shù)用來(lái)獲取本機(jī)ip地址htons()函數(shù)將無(wú)符號(hào)短整型轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序的數(shù)據(jù)本程序在windows環(huán)境下利用c+語(yǔ)言編寫(xiě)。三 程序流程四 具體程序代碼#include #include #include #include#include #pragma comment(lib,ws2_32) /指定連接到網(wǎng)絡(luò)應(yīng)用和internet#define io_rcvall _wsaiow(ioc_vendor,1) typedef struct ip_head unio

6、n /定義聯(lián)合 unsigned char version; unsigned char headlen; ; unsigned char servicetype; unsigned short totallen; unsigned short identifier; union unsigned short flags; unsigned short fragoffset; ; unsigned char timetolive; unsigned char protocol; unsigned short headchecksum; unsigned int sourceaddr; unsi

7、gned int destinaddr; unsigned char options; ip_head; /定義ip頭部的數(shù)據(jù)結(jié)構(gòu)void main(int argc,char *argv) using namespace std; ofstream outfile(c:logfile.txt,ios:out);if(argc!=2) coutendl請(qǐng)以下面格式輸入命令行:packparse packet_sumendl; return; wsadata wsadata; if(wsastartup(makeword(2,2), &wsadata)!=0) coutendlwsastartu

8、p初始化失敗endl; return; socket sock=socket(af_inet,sock_raw,ipproto_ip); /三個(gè)參分別為通信發(fā)生的區(qū)字段,套接字的類(lèi)型,與ip協(xié)議if(sock=invalid_socket) coutendl創(chuàng)建socket失敗!endl; closesocket(sock); wsacleanup(); bool flag=true; if(setsockopt(sock,ipproto_ip,ip_hdrincl,(char *) &flag,sizeof(flag)=socket_error) coutendlsetsockopt操作失敗

9、:wsagetlasterror()endl; closesocket(sock); wsacleanup(); char hostname128;/獲取主機(jī)名 if(gethostname(hostname,100)=socket_error) coutendlgethostname操作失敗:wsagetlasterror()endl; closesocket(sock); wsacleanup(); hostent *phostip; /獲取本地ipif(phostip=gethostbyname(hostname)=null) coutendlgethostbyname操作失敗:wsag

10、etlasterror()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 dwbytesreturned=0; if(wsaioctl(sock , io_rcvall ,&dwbufferinlen , sizeof(dwbuf

11、ferinlen) , &dwbufferlen,sizeof(dwbufferlen),&dwbytesreturned,null,null)=socket_error) coutendlwsaioctl操作失敗:wsagetlasterror()endl; closesocket(sock); /將網(wǎng)卡設(shè)為混雜模式,以接受所有數(shù)據(jù)wsacleanup(); coutendl開(kāi)始解析ip包:endl; char buffer65535; /設(shè)置緩沖區(qū)int packsum=atoi(argv1); /字符串轉(zhuǎn)換為整形for(int i=0;i0) /四個(gè)參數(shù)分別是套接字描述符,緩沖區(qū)的地址,

12、緩沖區(qū)大小,附加標(biāo)志 ip_head ip=*(ip_head *)buffer; cout-endl; cout版本:4)endl; /獲取頭部長(zhǎng)度字段cout頭部長(zhǎng)度:(ip.headlen &0x0f)*4)endl; /獲取頭部長(zhǎng)度字段cout服務(wù)類(lèi)型:priority5), service1)&0x0f)endl; /優(yōu)先級(jí)子域和tos子域cout總長(zhǎng)度:ip.totallenendl;/獲取總長(zhǎng)度字段 cout標(biāo)識(shí)符:ip.identifierendl;/獲取標(biāo)識(shí)字段 cout標(biāo)志位:15)&0x01),df= 14)&0x01),mf=13)&0x01)endl; /獲得標(biāo)志字段

13、cout片偏移:(ip.fragoffset&0x1fff)endl; /獲取分段偏移字段cout生存周期:(int)ip.timetoliveendl; /獲取生存時(shí)間字段cout協(xié)議:protocol(int)ip.protocolendl; /獲取協(xié)議字段cout頭部校驗(yàn)和:ip.headchecksumendl; /獲取頭校驗(yàn)和字段cout原地址:inet_ntoa(*(in_addr *)&ip.sourceaddr)endl; /獲取源ip地址字段cout目的ip地址:inet_ntoa(*(in_addr *)&ip.destinaddr)endl; /獲取目的ip地址字段out

14、file-endl; outfile版本:4)endl; outfile頭部長(zhǎng)度:(ip.headlen &0x0f)*4)endl; outfile服務(wù)類(lèi)型:priority5), service1)&0x0f)endl; outfile總長(zhǎng)度:ip.totallenendl; outfile標(biāo)識(shí)符:ip.identifierendl; outfile標(biāo)志位:15)&0x01),df= 14)&0x01),mf=13)&0x01)endl; outfile片偏移:(ip.fragoffset&0x1fff)endl; outfile生存周期:(int)ip.timetoliveendl; o

15、utfile協(xié)議:protocol(int)ip.protocolendl; outfile頭部校驗(yàn)和:ip.headchecksumendl; outfile原地址:inet_ntoa(*(in_addr *)&ip.sourceaddr)endl; outfile目的ip地址:inet_ntoa(*(in_addr *)&ip.destinaddr)endl; closesocket(sock); wsacleanup(); 五 程序運(yùn)行結(jié)果程序編譯運(yùn)行后:以命令行形式運(yùn)行程序ipparse:同時(shí)在程序所在的文件夾中生成了名為logfile的txt文件,里面記錄了上面顯示的內(nèi)容。六 調(diào)試過(guò)

16、程調(diào)試過(guò)程中遇到的問(wèn)題就是每次進(jìn)行錯(cuò)誤判斷后,如果出錯(cuò)結(jié)束程序。開(kāi)始用了goto exit_clean來(lái)進(jìn)行,但是程序報(bào)錯(cuò),所以在每次判斷后加上closesocket(sock); wsacleanup();來(lái)結(jié)束套接字的使用。七 心得體會(huì)通過(guò)這一個(gè)星期的課程設(shè)計(jì),我基本掌握了用套接字編程來(lái)實(shí)現(xiàn)獲取并解析ip數(shù)據(jù)包的方法。當(dāng)然,過(guò)程要比想象艱辛得多。首先是一個(gè)設(shè)計(jì)思想的問(wèn)題。眾所周知,ip數(shù)據(jù)報(bào)的格式說(shuō)明了ip協(xié)議都具有什么功能。但是由于在數(shù)據(jù)報(bào)環(huán)節(jié)知識(shí)的薄弱,我特地去圖書(shū)館查閱了相關(guān)資料,才大致了解了ip數(shù)據(jù)報(bào)的各種位與協(xié)議的概念和意義。進(jìn)而在腦中才形成了解決問(wèn)題的理念網(wǎng)卡可以接收流經(jīng)其的各種數(shù)據(jù)報(bào),所以毫無(wú)疑問(wèn)的應(yīng)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論