計算機網(wǎng)絡(luò)課程設(shè)計報告_第1頁
計算機網(wǎng)絡(luò)課程設(shè)計報告_第2頁
計算機網(wǎng)絡(luò)課程設(shè)計報告_第3頁
計算機網(wǎng)絡(luò)課程設(shè)計報告_第4頁
計算機網(wǎng)絡(luò)課程設(shè)計報告_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機網(wǎng)絡(luò)課程設(shè)計報告題目:ARP報文發(fā)送和解析一需求分析:網(wǎng)絡(luò)層,數(shù)據(jù)被組裝成IP包。但是發(fā)送IP包需要物理設(shè)備的支持(通常是Ethernet設(shè)備,在本課程設(shè)計中我們指定為Ethernet設(shè)備),即發(fā)送端必須知道目的物理地址才能將IP包發(fā)送出去,所以需要一種將IP地址映射為物理地址的機制。ARP協(xié)議就是用來完成這個任務(wù)的。ARP協(xié)議能夠在網(wǎng)絡(luò)上的每臺主機或設(shè)備都有一個或多個IP地址。IP地址是網(wǎng)絡(luò)層的地址。在同一個物理網(wǎng)絡(luò)中,在給定目的主機或設(shè)備的IP地址的條件下,得到目的主機或設(shè)備的物理地址。ARP報文發(fā)送需求:ARP分組必須在數(shù)據(jù)鏈路層被封裝成幀,才能發(fā)送出去。實現(xiàn)地址解析協(xié)議的第一步是

2、產(chǎn)生ARP請求分組。在相應(yīng)的字段寫入本地主機的源物理地址,源IP地址,目的IP地址;目的主機發(fā)送ARP應(yīng)答分組,在ARP應(yīng)答分組中,以請求分組中源物理地址,源IP地址作為其目的物理地址,目的IP地址,并將目的主機自身的物理地址,IP地址填入應(yīng)答報文的源物理地址,源IP地址字段。在程序設(shè)計過程中,需要用到Winpcap,Winpcap是Win32環(huán)境下數(shù)據(jù)包捕獲的開放代碼函數(shù)庫,基于Winpcap的應(yīng)用程序一般按照下面幾個步驟進行設(shè)計:·打開網(wǎng)卡設(shè)備列表。·選擇網(wǎng)卡并打開。·發(fā)送數(shù)據(jù)包。首先,需要獲得主機中的網(wǎng)卡列表,可以使用pacap_findalldevs()函

3、數(shù);然后,選擇列表中的某個網(wǎng)卡,可以使用pacap_open_live()函數(shù);最后,將封裝好的ARP包發(fā)送到目的主機,可以使用pacap_sendpacket()函數(shù)。獲取網(wǎng)卡列表后要求輸入相應(yīng)的源MAC地址,目的MAC地址,源IP地址,目的IP地址,這個時候就需要定義變量將輸入的值在窗口上顯示出來,可以使用GetWindowText()函數(shù)來顯示輸入的網(wǎng)卡信息,源MAC地址,目的MAC地址;對于IP地址,一般使用GetAddress()函數(shù)來顯示出來。要求構(gòu)造ARP包,用三個數(shù)據(jù)結(jié)構(gòu)體來定義ARP的頭部,以太網(wǎng)的頭部和用來填充的部分,然后對ARP各字段進行填充,在對ARP各字段進行填充時要

4、注意主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換,一般用到htons()函數(shù),即將本地主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序,避免地址轉(zhuǎn)換出現(xiàn)錯誤。ARP數(shù)據(jù)包構(gòu)造完成后就可以實現(xiàn)發(fā)送。根據(jù)發(fā)送請求報文還是應(yīng)答報文對目的MAC地址進行賦值,并對ARP數(shù)據(jù)包進行0填充。ARP包構(gòu)造完成后發(fā)送報文,要求打開輸出設(shè)備,將輸入的地址信息輸出發(fā)送,繼而進行釋放設(shè)備列表,清除資源。2 概要設(shè)計:1.結(jié)構(gòu)定義:根據(jù)ARP包結(jié)構(gòu),分別定義兩個子結(jié)構(gòu):ARP幀結(jié)構(gòu)和以太網(wǎng)幀結(jié)構(gòu)。/ARP幀結(jié)構(gòu)struct _ARP_HEADUSHORT hardware_type; /硬件類型 0x0001 USHORT protocal_type; /

5、協(xié)議類型 0x0800 UCHAR hardware_addr_len; /硬件地址長度 06 UCHAR protocal_addr_len; /協(xié)議地址長度 04 USHORT operation_field; /操作字段 01 request , 02 response UCHAR source_mac_addr6; /源mac地址 will be filled in runtime UCHAR source_ip_addr4; /源ip地址 localhost UCHAR dest_mac_addr6; /目的max地址 00:00:00:00:00:00 UCHAR dest_ip_

6、addr4; /目的ip地址 ;/ 以太網(wǎng)幀結(jié)構(gòu)struct _ETHER_HEADUCHAR dest_mac_addr6; /目的 mac 地址 UCHAR source_mac_addr6; /源 mac 地址 USHORT type; /幀類型 ; 開始1.流程圖:flag=0?定義ARP包結(jié)構(gòu)并初始化NARP請求,填充目的MAC地址(廣播,全F)及flagYARP請求,填充目的MAC地址及Flag獲取網(wǎng)卡列表?進入發(fā)送ARP包函數(shù)填充其他字段及ARP頭的各字段N選擇網(wǎng)卡并打開?YN釋放包結(jié)構(gòu)發(fā)送成功?分配及初始化發(fā)送包結(jié)構(gòu)YNY 結(jié)束三詳細設(shè)計1.定義ARP數(shù)據(jù)包及初始化:/*構(gòu)造A

7、RP數(shù)據(jù)包*/struct _ARP_ETHER_HEAD eh;_ARP_HEAD ah;UCHAR padding18; / to make sure the sizeof(BYTES) >= 60 ; _ARP arp;FormatMAC(arp.eh.source_mac_addr, user);/將輸入的MAC地址轉(zhuǎn)換為十六進制并且以字符串形式輸出arp.eh.type = htons(USHORT)0x0806);/arp數(shù)據(jù)包arp.ah.hardware_type = htons(USHORT)0x0001);tocal_type = htons(US

8、HORT)0x0800);arp.ah.hardware_addr_len = (UCHAR)0x06;tocal_addr_len = (UCHAR)0x04;arp.ah.source_ip_addr0 = field0;/源IP賦值arp.ah.source_ip_addr1 = field1;arp.ah.source_ip_addr2 = field2;arp.ah.source_ip_addr3 = field3;arp.ah.dest_ip_addr0 = field4;/目的IP賦值arp.ah.dest_ip_addr1 = field5;arp.ah.d

9、est_ip_addr2 = field6;arp.ah.dest_ip_addr3 = field7;請求報文與應(yīng)答報文(0表示請求,1表示應(yīng)答)在填充請求包時,因為請求包在Ethernet上廣播,所以以太網(wǎng)頭部的目的MAC地址要填充為FFFFFFFFFFFF;ARP幀結(jié)構(gòu)中的目的地址可填充為任意數(shù),因為它此時不起作用,所以填充數(shù)據(jù)字段要填充為。if (flag = 0) arp.ah.operation_field = htons(0x0001);/地址轉(zhuǎn)換for (i = 0; i < 6; i+) arp.eh.dest_mac_addri = (UCHAR)0xff;arp.a

10、h.dest_mac_addri = (UCHAR)0x00;elsearp.ah.operation_field = htons(0x0002);FormatMAC(arp.eh.dest_mac_addr, c_user);FormatMAC(arp.ah.dest_mac_addr, c_user);for (i = 0; i < 18; i+) /0填充18字節(jié)的0arp.paddingi = (UCHAR)0x00; 發(fā)送ARP數(shù)據(jù)包函數(shù):/* 發(fā)送數(shù)據(jù)包 */if (pcap_sendpacket(fp, (const u_char*)&arp, 60) != 0)e

11、xit(-1);MessageBox(_T("OK");. 獲取網(wǎng)卡列表:/* 獲取本機設(shè)備列表 */if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL,&alldevs,errbuf)= -1) exit(1);for (d = alldevs; d; d = d->next)CString temp(d->name);if (Netname=temp)break;if (d= NULL)MessageBox(_T("ERROR");exit(-1);/* 打開輸出設(shè)備 */if (fp

12、 = pcap_open(d->name, / 設(shè)備名100, / 要捕獲的部分 (只捕獲前100個字節(jié))PCAP_OPENFLAG_PROMISCUOUS, / 混雜模式1000, / 讀超時時間NULL, / 遠程機器驗證errbuf / 錯誤緩沖) = NULL)MessageBox(_T("1");exit(-1);/* 釋放設(shè)備列表 */pcap_freealldevs(alldevs);. 發(fā)送數(shù)據(jù)包/定義變量CString Netname;pcap_t *fp;char errbufPCAP_ERRBUF_SIZE;int i;pcap_if_t *al

13、ldevs;pcap_if_t *d;pcap_t *adhandle;/*獲取界面的值*/GetDlgItem(IDC_COMBO1)->GetWindowText(Netname);CString c_user;address1.GetWindowText(c_user);CString user;address2.GetWindowText(user);BYTE field0, field1, field2, field3;this->address3.GetAddress(field0, field1, field2, field3);CString ip;ip.Forma

14、t(_T("%d.%d.%d.%d"), field0, field1, field2, field3);BYTE field4, field5, field6, field7;this->address4.GetAddress(field4, field5, field6, field7);CString ip1;ip1.Format(_T("%d.%d.%d.%d"), field4, field5, field6, field7);if (pcap_sendpacket(fp, (const u_char*)&arp, 60) !=

15、0)exit(-1);MessageBox(_T("OK");4 調(diào)試分析在對ARP包中各字段進行填充時,需要注意主機字節(jié)序和網(wǎng)絡(luò)字節(jié)序的轉(zhuǎn)換。例如:arp.ah.hardware_type = htons(USHORT)0x0001);在獲取主機中的網(wǎng)卡列表時,我們可以使用pcap_findalldevs()函數(shù);選擇并打開列表里的某個網(wǎng)卡, 可以使用pcap_open_live()函數(shù);在將封裝好的ARP包發(fā)送到目的主機時,可以使用pcap_sendpacket()函數(shù)。在遇到獲取界面的值有誤的情況下,我們可以使用MessageBox()函數(shù)用來調(diào)試。在退出按鈕的代碼編

16、寫中,一般不使用exit()函數(shù),不知道具體原因,我在編輯代碼的過程中使用這個函數(shù)就會出現(xiàn)錯誤,因此我使用CDialog:OnCancel()函數(shù)提出,該函數(shù)就是響應(yīng)WM_CLOSE消息,調(diào)DestroyWindow將窗口句柄關(guān)掉。點擊一個按鈕跳出另一個窗口,可以在按鈕的實現(xiàn)代碼中用到DoModal()函數(shù)。在MFC中創(chuàng)建實現(xiàn)一個窗口后,如果還要新建一個窗口,就必須給此窗口添加類向?qū)?,使用該向?qū)目捎玫念愋蛶焯砑覯FC類。該向?qū)閺倪x定的類型庫添加的每個接口創(chuàng)建類。在對控件進行具體實現(xiàn)之前,必須要對控件添加變量,以用來獲取控件的取值以及具體函數(shù)的實現(xiàn),這一步至關(guān)重要。在程序設(shè)計過程中要注意網(wǎng)絡(luò)

17、主機 字節(jié)順序的轉(zhuǎn)化。由于不同的計算機系統(tǒng)所采用的數(shù)據(jù)表示方式不同,對于2B或4B的數(shù)據(jù),有的采用低字節(jié)地址存放數(shù)據(jù)的高權(quán)值位,而有的卻以低地址字節(jié)存放數(shù)據(jù)的低權(quán)位值,在網(wǎng)絡(luò)的數(shù)據(jù)傳輸中,我們應(yīng)該統(tǒng)一標示,所以我們應(yīng)將數(shù)據(jù)包頭部的表示長度或類型的數(shù)據(jù)轉(zhuǎn)換成本地機的表達形式??梢粤死胔tohs()將網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序,這也是不能忽略的問題,如果不注意,就會出現(xiàn)地址轉(zhuǎn)換的錯誤。以下為執(zhí)行調(diào)試界面:五課設(shè)總結(jié) 在本次課程設(shè)計中,收獲頗多。從剛開始安裝Visual studio,配置安裝環(huán)境,再到建立MFC工程,這個過程中,百度成了我最好的老師,最后終于搞定。通過本次課程設(shè)計,對MFC也是了解了很多,通過網(wǎng)上查找博客,了解了MFC中控件的用法以及屬性設(shè)置,雖然理解可能還不是那么的透徹,但最基本的使用還是掌握了。這次課設(shè)的順利完成,主要是參考了WinpCap中文文檔,網(wǎng)絡(luò)編程的一些主要算法,文檔都有舉例說明,也有詳細的說明,這極大的幫助了我完成一些代碼的處理,也促進了理解。通過這次課程設(shè)計,也讓我學會了獨立思考解決問題,雖然很多還是通過百度來解決,但至少也是自己思考的過程,我也覺得和同學交流討論也很重要,

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論