版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、central south university計算機網(wǎng)絡課程設計報告目錄第一章 課程設計的目的與要求11.1 課程設計的目的11.2 課程設計的要求1第二章 課程設計的內(nèi)容32.1 課程設計的內(nèi)容32.2 內(nèi)容的要求3第三章 程序分析與設計43.1 ip數(shù)據(jù)包43.1.1 ip數(shù)據(jù)包的格式說明43.1.2 ip數(shù)據(jù)包的格式43.1.3 ip數(shù)據(jù)包的c+定義53.1.4 ip數(shù)據(jù)包的解析63.2 套接字73.1.4 套接字的使用73.1.4 使用原始套接字73.3 接受數(shù)據(jù)包7第4章 實驗結(jié)果104.1 程序截圖10第五章 總結(jié)115.1 實驗心得11第六章 附錄126.1 源代碼12第一章
2、課程設計的目的與要求1.1 課程設計的目的 計算機網(wǎng)絡課程設計的目的,是為了讓學生更深入地掌握計算機網(wǎng)絡的核心內(nèi)容,實現(xiàn)理論與實踐相結(jié)合。讓學生用具體的實踐成果,體現(xiàn)對理論知識的掌握程度。有利于學生提高計算機網(wǎng)絡的實踐能力,加深對計算機網(wǎng)絡理論知識的理解。1.2 課程設計的要求(1)編寫程序,實現(xiàn)系統(tǒng)的基本功能,鼓勵自行增加新功能;(2)要有用戶界面:要求至少采用文本菜單界面;鼓勵采用圖形菜單界面;(3)寫課程設計報告,內(nèi)容包括:l 封面(參見附錄i)l 需求分析:以無歧義的陳述說明程序設計的任務,強調(diào)的是程序要做什么?給出功能模塊圖和流程圖。同時明確規(guī)定:輸入的形式和輸出值的范圍;輸出的形式
3、;程序所能夠達到的功能;測試數(shù)據(jù),包括正確的輸入及其輸出結(jié)果和含有錯誤的輸入及其輸出結(jié)果。l 概要設計:包括程序設計組成框圖,程序中使用的存儲結(jié)構(gòu)設計說明(如果指定存儲結(jié)構(gòu)請寫出該存儲結(jié)構(gòu)的定義)。l 詳細設計:包括模塊功能說明(如函數(shù)功能、入口及出口參數(shù)說明,函數(shù)調(diào)用關系描述等),每個模塊的算法設計說明(可以是描述算法的流程圖)。其中源程序要按照寫程序的規(guī)則來編寫,結(jié)構(gòu)清晰,重點函數(shù)的重點變量,重點功能部分要加上清晰的程序注釋。l 運行結(jié)果:包括典型的界面、輸入和輸出數(shù)據(jù)等;l 總結(jié):包括課程設計中遇到的問題,解決問題的過程及體會、收獲、對課程設計的認識與思考等。l 附錄:包括主要程序清單,
4、要有適當?shù)淖⑨?,使程序容易閱讀。(4)課程設計報告書寫規(guī)范參見附錄ii,不按照規(guī)范書寫的,成績不能評為“優(yōu)”或“良”。(5)無論在校外、校內(nèi),都要嚴格遵守學校和所在單位的學習和勞動紀律、 1規(guī)章制度,學生有事離校必須請假。課程設計期間,無故缺席按曠課處理;缺席時間達四分之一以上者,其成績按不及格處理。第二章 課程設計的內(nèi)容2.1 課程設計的內(nèi)容本次實驗的要求在網(wǎng)絡環(huán)境,使用vc+編寫程序?qū)崿F(xiàn)捕獲網(wǎng)絡中的ip數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標準輸出上,并同時寫入日志文件。2.2 內(nèi)容的要求(1)以命令行形式運行(應如程序名+參數(shù)名):ipparse logfile,其中ipparse是程序
5、名,而logfile為該程序所帶參數(shù),其代表記錄結(jié)果的日志文件。(2)在標準輸出和日志文件中寫入捕獲的ip包的版本、頭長度、服務類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標識、分段標志、分段偏移值、生存時間、上層協(xié)議類型、頭校驗和、源ip地址和目的ip地址等內(nèi)容。 (3)當程序接收到鍵盤輸入ctrlc時退出。第三章 程序設計與分析3.1 ip數(shù)據(jù)包3.1.1 ip數(shù)據(jù)包的格式說明 ip數(shù)據(jù)包格式包含了標頭固定部分,標頭可變部分和數(shù)據(jù)區(qū)三部分。ip數(shù)據(jù)報標頭部分固定為20個字節(jié),其中包含了12個參數(shù)域,各參數(shù)域隱含著網(wǎng)間協(xié)議的傳輸機制。ip具體的標頭格式如圖1所示。 各參數(shù)域的具體含義如下:1) 版本號:長度4
6、位,表示所使用的ip協(xié)議的版本。ipv4版本號字段值為4;ipv6版本號字段號的值為6.2) 標頭長:長度4位,定義了一個以4b為一個單位的ip包的報頭長度3) 服務類型:共8位,高3位組成優(yōu)先級子域,隨后4位組成服務類型子域。4) 數(shù)據(jù)報總長度:總長度為2b(即6位)。定義了以字節(jié)為單位的數(shù)據(jù)報的總長度。5) 重裝標識:長度16位,用于識別ip數(shù)據(jù)報的編號,讓目的主機判斷新來的數(shù)據(jù)屬于哪個分組。6) 分片標識:共3位,最高位為0;df禁止分片標識。df=0,可以分片;df=1,不能分片。mf:分片標識。mf=0,表示接的是最后一個分片;mf=1,不是最后一個分片。7) 片偏移值:共13位,說
7、明分片在整個數(shù)據(jù)報中的相對位置。8) 生存周期:8位,用來設置數(shù)據(jù)數(shù)據(jù)報在整個網(wǎng)絡傳輸過程中的壽命。常以一個數(shù)據(jù)報可以經(jīng)過的最多的路由器跳步數(shù)來控制。9) 協(xié)議類型:共8位,表示該ip數(shù)據(jù)報的高層協(xié)議類型。10) 標頭校驗和:共16位,用于存放檢查報頭錯誤的校驗碼。11) 源、宿主機地址:共32位,分別表示發(fā)送和接受數(shù)據(jù)報的源主機和宿主機的ip地址。選項數(shù)據(jù)域:0-40b,用于控制和測試3.1.2 ip數(shù)據(jù)包的格式3.1.3 ip數(shù)據(jù)包的c+定義typedef struct _ipunionbyte version; / 版本byte hdrlen;/iht;byte servicetype;
8、 / 服務類型word totallen; / 總長word id; / 標識union word flags; / 標志word fragoff; / 分段偏移;byte timetolive; / 生命期byte protocol; / 協(xié)議word hdrchksum; / 頭校驗和dword srcaddr; / 源地址dword dstaddr; / 目的地址byte options; / 選項 ip;3.1.4 ip數(shù)據(jù)包的解析通過ip_header解析ip頭各個字段的代碼:/*獲取版本字段*/ip.version>>4;/*獲取頭部長度字段*/ip.hdrlen &a
9、mp; 0x0f;/*獲取服務類型字段中的優(yōu)先級子域*/ip.servicetype>>5;/*獲取服務類型字段中的tos子域*/(ip.servicetype>>1)&0x0f;/*獲取總長度字段*/ip.totallen;/*獲取標識字段*/ip.id;/*解析標志字段*/df = (ip.flags>>14) & 0x01;mf = (ip.flags>>13) & 0x01;/*獲取分段偏移字段*/ip.fragoff & 0x1fff;/*獲取生存時間字段*/ip.timetolive;/*獲取協(xié)議字段*
10、/ip.protocol;/*獲取頭校驗和字段*/ip.hdrchksum;/*解析源ip地址字段*/inet_ntoa(*(in_addr*)&ip.srcaddr);/*解析目的ip地址字段*/inet_ntoa(*(in_addr*)&ip.dstaddr);3.2 套接字3.2.1 套接字的使用本程序使用套接字socket編程,將網(wǎng)卡設為能夠接受流經(jīng)網(wǎng)卡的所有類型的數(shù)據(jù)包。首先,初始化套接字,然后監(jiān)聽數(shù)據(jù)包,解析數(shù)據(jù)包。socket sock=socket(af_inet,sock_raw,ipproto_ip)用來創(chuàng)建套接字,其參數(shù)為通信發(fā)生的區(qū)字段和套接字的類型。
11、wsaioctl(sock,io_rcvall ,&dwbufferinlen , sizeof(dwbufferinlen)函數(shù)用來把網(wǎng)卡設置為混雜模式。recv(sock,buffer,65535,0)函數(shù)用來接收經(jīng)過的ip包,其參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)的大小。3.2.1 使用原始套接字 要進行ip層數(shù)據(jù)包的接收和發(fā)送,應使用原始套接字。創(chuàng)建原始套接字的代碼如下: socket sock;sock=wsasoccket(af_inet,sock_raw,ipproto_ip,null,0,wsa_flag_overlapped);在wsasoccket函數(shù)中,第
12、一個參數(shù)指定通信發(fā)生的區(qū)字段,af_inet是針對internet的,允許在遠程主機之間通信。第二個參數(shù)是套接字的類型,在af_inet地址族下,有sock_stream、sock_dgram、sock_raw三種套接字類型。在這里,設置為sock_raw,表示聲明的是一個原始套接字類型。第三個參數(shù)依賴于第二個參數(shù),用于指定套接字所有的特定協(xié)議,這里使用ip協(xié)議。第四個參數(shù)為wsaprotocol_info位,該位可以置空。第五個參數(shù)保留,永遠置0。第六個參數(shù)是標志位,wsa_flag_overlapped表明可以使用發(fā)送接收超時設置。創(chuàng)建原始套接字后,ip頭就會包含在接收的數(shù)據(jù)中。然后,可以
13、設置ip頭操作選項,調(diào)用setsockopt函數(shù)。其中flag設置為true,并設定ip_hdrincl選項,表明用戶可以親自對ip頭進行處理。bool flag=true;setsockopt(sock,ipproto_ip,ip_hdrincl,(char*)&flag,sizeof(flag);之后,使用如下代碼完成對socket的初始化工作:/*獲取主機名*/char hostname128;gethostname(hostname,100);/*獲取本地ip地址*/hostent * phostip;phostip = gethostbyname(hostname);/*填充
14、sockaddr_in結(jié)構(gòu)的內(nèi)容*/sockaddr_in addr_in;addr_in.sin_addr = *(in_addr *)phostip->h_addr_list0;addr_in.sin_family = af_inet;addr_in.sin_port = htons(6000);/*綁定socket*/bind(sock,(psockaddr)&addr_in,sizeof(addr_in);填寫sockaddr_in的內(nèi)容時,其地址值應填寫為本機ip地址,本機ip地址可以通過gethostbyname()函數(shù)獲?。欢丝谔柨梢噪S便填寫,但不能與系統(tǒng)沖突;協(xié)議
15、族應填為af_inet。使用htons()函數(shù)可以將無符號短整型的主機數(shù)據(jù)轉(zhuǎn)換為網(wǎng)絡字節(jié)順序的數(shù)據(jù)。最后使用bind(0函數(shù)將socket綁定到本機網(wǎng)卡上。綁定網(wǎng)卡后,需要用wsaioctl()函數(shù)把網(wǎng)卡設置為混雜模式,使網(wǎng)卡能夠接收所有網(wǎng)絡數(shù)據(jù),其關鍵代碼如下:#define sio_rcvall_wsaiow(ioc_vendor,1)dword dwbufferlen10;dword dwbufferinlen = 1;dword dwbytesreturned = 0;wsaioct1(sniffersocket, io_rcvall,&dwbufferinlen,sizeof
16、(dwbufferinlen),&dwbufferlen,sizeof(dwbufferlen),&dwbytesreturned,null,null);如果接收的數(shù)據(jù)包中的協(xié)議類型和定義的原始套接字匹配,那么接收到的數(shù)據(jù)就拷貝到套接字中。因此,網(wǎng)卡就可以接收所有經(jīng)過的ip包。3.3 接收數(shù)據(jù)包 在程序中可使用recv()函數(shù)接收經(jīng)過的ip包。該函數(shù)有四個參數(shù),第一個參數(shù)接收操作所用的套接字描述符;第二個參數(shù)接收緩沖區(qū)的地址;第三個參數(shù)接收緩沖區(qū)的大小,也就是所要接收的字節(jié)數(shù);第四個參數(shù)是一個附加標志,如果對所發(fā)送的數(shù)據(jù)沒特殊要求,直接設為0。因為ip數(shù)據(jù)包的最大長度是6553
17、5b,因此,緩沖區(qū)的大小不能小于65535b。設置緩沖區(qū)后,可利用循環(huán)來反復監(jiān)聽接收ip包,用recv()函數(shù)實現(xiàn)接收功能的代碼如下:#define buffer_size 65535char bufferbuffer_size; /設置緩沖區(qū)while(true)recv(sock,buffer,buffer_size,0); /接收數(shù)據(jù)包 /*然后是解析接收的ip包*/第4章 實驗結(jié)果4.1 程序截圖第5章 總結(jié)通過這次課程設計,我們了解到關于計算機網(wǎng)絡數(shù)據(jù)傳送及處理過程中,軟件起到了巨大的作用。熟悉了c+語言在計算機網(wǎng)絡方面的應用,是一次難得的機會。此外,我還了解了網(wǎng)絡通信協(xié)議的基本工作
18、原理及套接字的使用,雖然剛開始的時候比較模糊,但是通過與同學共同探討和網(wǎng)上查閱資料,最終我成功完成了實驗。這次課程設計培養(yǎng)了我們基本掌握網(wǎng)絡編程的基本思路和方法,讓我們懂得如何去學習這類東西。同時提高我們對所學計算機網(wǎng)絡理論知識的理解能力,提高和挖掘我們對所學知識的實際應用能力和創(chuàng)新能力。同學們的合作是實驗成功的必要條件,而謹慎對待事物的態(tài)度是成功的關鍵。第6章 附錄6.1 源代碼#include <stdio.h>#include <iostream.h>#include <winsock2.h>#include <ws2tcpip.h>#pr
19、agma comment (lib,"ws2_32.lib")#define buffer_size 65535#define io_rcvall _wsaiow(ioc_vendor,1)typedef struct _ip_header /定義ip頭unionbyte version; /版本(前4位) byte hdrlen; /報頭標長(后4位),ip頭長度;byte servicetype; /服務類型word totallen; /數(shù)據(jù)報總長word id; /標識unionword flags; /標識(前3位)word fragoff; /分段偏移(后13位
20、);byte timetolive; /生存周期byte protocol; /協(xié)議word hdrchksum; /頭校驗和dword srcaddr; /源地址dword dstaddr; /目地地址byte options; /選項ip_header;char * parseservicetype_getprocedence(byte b)switch(b>>5)/獲取服務類型字段中優(yōu)先級子域case 7: return "network control"/網(wǎng)絡控制break;case 6:return "internet work contro
21、l" /網(wǎng)絡控制break;case 5:return "critic/ecp" break;case 4:return "flash override"/最優(yōu)先信號break;case 3: return "flsah" break;case 2:return "immediate" break;case 1:return "priority"/協(xié)議break;case 0:return "routine"/路由break;default:return "
22、;unknow"break;char * parseservicetype_gettos(byte b)b=(b>>1)&0x0f;/獲取服務類型字段中的tos子域switch(b) case 0:return "normal service" /正常運行break;case 1:return "minimize monetary cost" /成本break;case 2:return "maximize reliability" /可靠性break;case 4:return "maximi
23、ze throughput" /吞吐量break;case 8:return "minimize delay" /延遲break;case 15:return "maximize security" /安全性break; default:return "unknow" char * getprotocol(byte protocol) /獲取協(xié)議字段共8位switch(protocol) /以下為協(xié)議號說明: case 1:return "icmp" /internet控制報文協(xié)議case 2:retur
24、n "igmp" /internet組管理協(xié)議case 4: return "ip in ip"/移動ip數(shù)據(jù)封裝和隧道case 6:return "tcp"/傳輸控制協(xié)議case 8:return "egp"/外部網(wǎng)關協(xié)議case 17:return "udp"/用戶數(shù)據(jù)報文協(xié)議case 41:return "ipv6"case 46:return "rsvp"/資源預留協(xié)議case 89:return "ospf"/open sho
25、rtest path first 開發(fā)式最短路徑優(yōu)先default:return "unknow"void ipparse(file* file,char* buffer)ip_header ip=*(ip_header*)buffer; /通過指針把緩沖區(qū)的內(nèi)容強制轉(zhuǎn)化為ip_header數(shù)據(jù)結(jié)構(gòu)fseek(file,0,seek_end); fprintf(file,"_rn");fprintf(file,"版本號:ipv%drn",ip.version>>4);fprintf(file,"報頭標長:%d (
26、byte)rn",(ip.hdrlen & 0x0f)*4);fprintf(file,"服務器類型 : %s,%srn",parseservicetype_getprocedence(ip.servicetype), parseservicetype_gettos(ip.servicetype);fprintf(file,"總長度 : %d(byte)rn",ip.totallen);fprintf(file,"標識 : %drn",ip.id);fprintf(file,"標志位 df:%d , mf=
27、%drn",(ip.flags>>14)&0x01),(ip.flags>>13)&0x01);fprintf(file,"分段偏移值 : %drn",(ip.fragoff&0x1fff); fprintf(file,"生存期 : %d (hops)rn",ip.timetolive);fprintf(file,"協(xié)議 : %srn",getprotocol(ip.protocol);fprintf(file,"頭校驗和 : 0x%0xrn",ip.hdr
28、chksum);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()file * file;if(file=fopen("logfile.txt","wb+")=null)printf("fail to open f
29、ile %s");return -1;word rv;wsadata wsadata; /定義了能夠儲存wsastarup調(diào)用返回值的結(jié)構(gòu)rv=makeword(2,2); /winsock2版本wsastartup(rv,&wsadata);socket sock=socket(af_inet,sock_raw,ipproto_ip); /創(chuàng)建套接字,sock為套接字描述符bool flag=true;setsockopt(sock,ipproto_ip,ip_hdrincl,(char*)&flag,sizeof(flag);/任意類型、任意狀態(tài)套接口的設置選項值
30、char hostname128;gethostname(hostname,100); /獲取主機名hostent * phostip;/獲取本地ip地址phostip = gethostbyname(hostname);sockaddr_in addr_in;addr_in.sin_addr=*(in_addr *)phostip->h_addr_list0;addr_in.sin_family = af_inet;addr_in.sin_port = htons(6000); /將無符號短整型主機數(shù)據(jù)轉(zhuǎn)換為網(wǎng)絡字節(jié)順序數(shù)據(jù)bind(sock,(psockaddr)&addr_in,sizeof(addr_in);dword dwbufferlen10; /設置網(wǎng)卡為混雜模式 dword dwbufferinlen=1;dword dwbytesreturned=0;wsaioctl(sock, io_rcvall,&dwbufferinlen,sizeof(dwbufferinlen),&dwbufferlen,sizeof(dwbufferlen),&dwbytesreturned,null,
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度水資源保護與修復工程監(jiān)理協(xié)議2篇
- 學校突發(fā)公共衛(wèi)生事件應急預案例文(5篇)
- 二零二五年度桉樹木材出口代理服務合同3篇
- 二零二五年度文化藝術保險合同執(zhí)行與藝術品風險全面擔保協(xié)議3篇
- 手術室安全管理制度模版(3篇)
- 自行車課程設計論文
- ktv部服務員職責(3篇)
- 2025年科研項目立項管理制度范文(2篇)
- 二零二五年度房地產(chǎn)聯(lián)建合作開發(fā)委托協(xié)議2篇
- 車輛擁堵交通事故識別系統(tǒng)
- 足浴技師與店內(nèi)禁止黃賭毒協(xié)議書范文
- 銑工高級工測試題(含答案)
- 送貨員崗位勞動合同模板
- 2024年自然資源部所屬事業(yè)單位招聘(208人)歷年高頻難、易錯點500題模擬試題附帶答案詳解
- 上海南洋模范2025屆高二生物第一學期期末檢測模擬試題含解析
- 《建筑施工安全檢查標準》JGJ59-2019
- 廣東茂名市選聘市屬國有企業(yè)招聘筆試題庫2024
- 2025屆高考數(shù)學一輪復習建議-函數(shù)與導數(shù)專題講座課件
- 2024-2030年中國高性能混凝土行業(yè)銷售規(guī)模與投資盈利預測報告
- 江蘇省常州市教育學會2023-2024學年高一上學期期末考試化學試題 (解析版)
- 中醫(yī)兒科護理課件
評論
0/150
提交評論