![網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì).doc_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-2/28/6035ce16-ef82-4cb8-bdef-931e4ef50c2f/6035ce16-ef82-4cb8-bdef-931e4ef50c2f1.gif)
![網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì).doc_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-2/28/6035ce16-ef82-4cb8-bdef-931e4ef50c2f/6035ce16-ef82-4cb8-bdef-931e4ef50c2f2.gif)
![網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì).doc_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-2/28/6035ce16-ef82-4cb8-bdef-931e4ef50c2f/6035ce16-ef82-4cb8-bdef-931e4ef50c2f3.gif)
![網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì).doc_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-2/28/6035ce16-ef82-4cb8-bdef-931e4ef50c2f/6035ce16-ef82-4cb8-bdef-931e4ef50c2f4.gif)
![網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì).doc_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2020-2/28/6035ce16-ef82-4cb8-bdef-931e4ef50c2f/6035ce16-ef82-4cb8-bdef-931e4ef50c2f5.gif)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系網(wǎng)站刪除網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì)指導(dǎo)教師: 學(xué)生班級(jí): 網(wǎng)絡(luò)10802 學(xué)生姓名: 學(xué) 號(hào): 班內(nèi)序號(hào): 21 課設(shè)日期:2011/7/52011/7/12 目 錄一、課程設(shè)計(jì)目的與任務(wù)3二、設(shè)計(jì)任務(wù)及要求31、RAW模式的SOCKET編程32、具體內(nèi)容3三、需求分析4四、總體設(shè)計(jì)(流程圖)5五、詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)6六、實(shí)現(xiàn)結(jié)果及結(jié)果分析11七、使用說(shuō)明14八、課設(shè)小結(jié)14一、課程設(shè)計(jì)目的與任務(wù)網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì)是學(xué)習(xí)TCP/IP協(xié)議分析課程后的一個(gè)重要實(shí)踐環(huán)節(jié),是對(duì)學(xué)生進(jìn)行的一次較為全面的網(wǎng)絡(luò)協(xié)議分析應(yīng)用程序設(shè)計(jì)訓(xùn)練。其基本目的是:(1)培養(yǎng)學(xué)生理論聯(lián)系實(shí)際的設(shè)計(jì)思想,訓(xùn)練綜合運(yùn)用所學(xué)的基礎(chǔ)理論知識(shí),結(jié)合生產(chǎn)實(shí)際分析和解決網(wǎng)絡(luò)應(yīng)用中基本問(wèn)題的能力,從而使基礎(chǔ)理論知識(shí)得到鞏固和加深。(2)訓(xùn)練學(xué)生運(yùn)用軟件工程的原理、方法和工具完整地設(shè)計(jì)并開(kāi)發(fā)一個(gè)網(wǎng)絡(luò)應(yīng)用系統(tǒng),歷練軟件工程常規(guī)設(shè)計(jì)過(guò)程和基本方法。為將來(lái)的實(shí)際應(yīng)用開(kāi)發(fā)打好基礎(chǔ)。(3)深層次掌握TCP/IP協(xié)議的基本原理與數(shù)據(jù)格式。(4)熟悉并掌握網(wǎng)絡(luò)通信協(xié)議Socket編程的方法。 二、設(shè)計(jì)任務(wù)及要求1、RAW模式的SOCKET編程PING程序是面向用戶(hù)的應(yīng)用程序,該程序使用ICMP的封裝機(jī)制,通過(guò)IP協(xié)議來(lái)工作為了實(shí)現(xiàn)直接對(duì)IP和ICMP包進(jìn)行操作,實(shí)驗(yàn)中使用RAW模式的SOCKET編程。熟悉SOCKET的編程,包括基本的系統(tǒng)調(diào)用如SOCKET、BIND等。2、具體內(nèi)容1) 定義數(shù)據(jù)結(jié)構(gòu)需要定義好IP數(shù)據(jù)報(bào)、ICMP包等相關(guān)的數(shù)據(jù)結(jié)構(gòu)2) 程序?qū)崿F(xiàn)在WINDOWS環(huán)境下實(shí)現(xiàn)PING程序3) 程序要求在窗體文本框中輸入: PING .其中為目的主機(jī)的IP地址,不要求支持域名,對(duì)是否帶有開(kāi)關(guān)變量也不做要求。不帶開(kāi)關(guān)變量時(shí),要求返回4次響應(yīng)。返回信息顯示在窗體上: REPLY FROM .或 REQUEST TimeOut (無(wú)法PING通的情況) (3)實(shí)驗(yàn)步驟和注意事項(xiàng)1、 熟悉IP以及ICMP協(xié)議的工作機(jī)制2、 熟悉RAW模式的SOCKET編程3、 編寫(xiě)PING的實(shí)現(xiàn)程序4、 編譯環(huán)境中需要包括SOCKET庫(kù) WS2_32.lib5、 在模擬實(shí)現(xiàn)環(huán)境下調(diào)試并運(yùn)行自己編寫(xiě)的PING程序三、需求分析在帶界面的PING程序中最基本的需要是用以輸入IP的文本框,顯示reply的文本框和幾個(gè)基本按鈕。這個(gè)要事先知道在PING .后的reply要返回哪些內(nèi)容,上面已經(jīng)要求返回4次響應(yīng),每次相應(yīng)的reply就以我們平時(shí)在doc下ping的結(jié)果為模板REPLY FROM .:Bytes=XX TTL=XXX Time=XXms.雖然要求為目的主機(jī)的IP地址,不要求支持域名但域名的轉(zhuǎn)換還是蠻簡(jiǎn)單的固定代碼就加上去了。也添加了兩個(gè)清空的按鈕以便于用戶(hù)使用。四、總體設(shè)計(jì)(流程圖)A ping B結(jié) 束將ICMP封裝到IP數(shù)據(jù)報(bào)中并發(fā)送給B計(jì)算校驗(yàn)和、獲取ip封裝ICMP接受B的回復(fù)判斷接受字節(jié)數(shù)是否為0解析收到的報(bào)文核實(shí)收到的ID號(hào)和發(fā)送的是否一致丟棄返回目地IP、字節(jié)數(shù)、TTL值、時(shí)間戳是否不一致一致五、詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)1.用vc新建一個(gè)MFC對(duì)話框工程,從控件中拖入靜態(tài)文本右擊屬性修改id和標(biāo)題,類(lèi)似的再拖入其他的編輯框和按鈕,在顯示reply的編輯框的屬性中要勾選只讀,這樣既可以無(wú)法修改reply又可以節(jié)省復(fù)制粘貼的代碼。在界面大致完成的時(shí)候界面如下: 圖一:完成界面結(jié)構(gòu)因?yàn)槟J(rèn)的是白色所以在Initlnstance()中添加SetDialogBkColor (RGB (128, 184, 223), RGB ( 0, 0 , 150 ) );使得界面的背景色變?yōu)樗{(lán)色。 圖二:改變背景BOOL CPingApp:InitInstance()SetDialogBkColor (RGB (128, 184, 223), RGB ( 0, 0 , 150 ) );覺(jué)得通用的.ico圖片不是我想要的便換了一張。在此時(shí)運(yùn)行得到的界面效果是: 圖三:沒(méi)有任何的功能的藍(lán)色界面效果2.接下來(lái)就是在.cpp文件中添加相應(yīng)的代碼以實(shí)現(xiàn)老師和自己的要求。首先是定義ip和icmp 的首部,這些代碼是固定的所以直接復(fù)制粘貼了。typedef struct ip_hdr /定義IP首部 unsigned char h_verlen; /4位首部長(zhǎng)度,4位IP版本號(hào) unsigned char tos; /8位服務(wù)類(lèi)型TOS unsigned short total_len; /16位總長(zhǎng)度(字節(jié)) unsigned short ident; /16位標(biāo)識(shí) unsigned short frag_and_flags;/3位標(biāo)志位 unsigned char ttl; /8位生存時(shí)間 TTL unsigned char proto; /8位協(xié)議 (TCP, UDP 或其他) unsigned short checksum; /16位IP首部校驗(yàn)和 unsigned int sourceIP; /32位源IP地址 unsigned int destIP; /32位目的IP地址 IP_HEADER; typedef struct icmp_hdr BYTE i_type; / ICMP報(bào)文類(lèi)型 BYTE i_code; / ICMP代碼 USHORT i_cksum; / 校驗(yàn)和 USHORT i_id; / 標(biāo)志符 USHORT i_seq; / 序號(hào) ULONG timestamp; / 時(shí)間戳 ICMP_HEADER;3.初始化void CPingDlg:OnPing() /初始化/ TODO: Add your control notification handler code hereint rect; WSADATA WSAData; if (WSAStartup(MAKEWORD(2,2), &WSAData) != 0 ) printf (WSAStartup Error!n); /如果初始化不成功則報(bào)錯(cuò)exit(0); SOCKET sock4; for(int i=0; i h_addr_list0); ICMP_HEADER icmpHeader; SOCKADDR_IN addr_in,addr_from; char recvbuf1024; socki= socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); int nTimeOut = 1000; /超時(shí)毫秒/設(shè)置發(fā)送超時(shí)和接收超時(shí)setsockopt(socki, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOut, sizeof(nTimeOut); setsockopt(socki, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTimeOut, sizeof(nTimeOut); memset(&addr_in, 0, sizeof(addr_in); addr_in.sin_family = AF_INET; /為網(wǎng)絡(luò)地址類(lèi)型,一般為AF_INETaddr_in.sin_addr.S_un.S_addr = inet_addr(ip); /IP/設(shè)置數(shù)據(jù)報(bào)頭memset(&icmpHeader, 0, sizeof(icmpHeader); icmpHeader.i_type = 8; icmpHeader.i_code = 0; icmpHeader.i_cksum = 0; icmpHeader.i_id = (USHORT)GetCurrentProcessId(); icmpHeader.i_seq = 0; icmpHeader.timestamp = GetTickCount(); icmpHeader.i_cksum = checksum(USHORT*)&icmpHeader, sizeof(icmpHeader); /發(fā)送一個(gè)icmpHeaderrect = sendto(socki, (char*)&icmpHeader, sizeof(icmpHeader), 0, (sockaddr*)&addr_in, sizeof(addr_in); int addr_from_len; addr_from_len = sizeof(addr_from); /接收的數(shù)據(jù)報(bào)為IP頭+ICMP頭rect = recvfrom(socki, recvbuf, sizeof(recvbuf), 0, (sockaddr*)&addr_from, &addr_from_len);/rect為接收的字節(jié)數(shù) if(rect0)/正確就調(diào)用DecodeHeader輸出DecodeHeader(recvbuf, rect); else CString reply=REQUEST TimeOut!;SetDlgItemText(IDC_REPLY,reply);closesocket(socki); WSACleanup(); 用于初始化各個(gè)全局變量,為全局變量賦初始值;初始化,加載庫(kù)。定義一個(gè)Cstring reply用以輸出。例如當(dāng)超時(shí)時(shí)便輸出REQUEST TimeOut!CString reply=REQUEST TimeOut!;SetDlgItemText(IDC_REPLY,reply);域名轉(zhuǎn)換:hostent *hp=gethostbyname(ip);/域名轉(zhuǎn)換成IPif(hp!=NULL)ip=inet_ntoa(*(struct in_addr*)hp- h_addr_list0); 4.在CDlg中添加函數(shù)USHORT CPingDlg:checksum(USHORT *buffer, int size) 圖四:添加cheksum()函數(shù)checksum()函數(shù)用于計(jì)算校驗(yàn)和。計(jì)算過(guò)程是首先把數(shù)據(jù)報(bào)頭中的校驗(yàn)和字段設(shè)置為0,然后對(duì)首部中每個(gè)16bit 進(jìn)行二字段進(jìn)制反碼求和(整個(gè)首部看成是由一串16bit的字組成),結(jié)果存在校驗(yàn)和字段中。其中buffer 用于存放ICMP數(shù)據(jù),size表示ICMP報(bào)文大小。USHORT CPingDlg:checksum(USHORT *buffer, int size)unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) /若size為奇數(shù) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (USHORT)(cksum); 5.添加函數(shù)void CPingDlg:DecodeHeader(char *buf, int len)解讀報(bào)頭函數(shù)在初始化中if(rect0)DecodeHeader(recvbuf, rect); 即正確時(shí)就調(diào)用DecodeHeader輸出 if (icmpHeader-i_id != (USHORT)GetCurrentProcessId() /核實(shí)收到的ID號(hào)和發(fā)送的是否一致 printf(someone elses packet!n);return; CString reply;reply.Format(Reply from %s: Bytes= %d TTL = %d Time= %d ms.rn, inet_ntoa(addr), len, ipHeader-ttl, Time1-icmpHeader-timestamp);m_reply+=reply;SetDlgItemText(IDC_REPLY,m_reply+ping is complete!);/Sleep(500);6.添加自己加上去的小函數(shù)重置:因?yàn)檩斎雐p/域名的id設(shè)為了IDC_IP所以GetDlgItem(IDC_IP)-SetWindowText();便可以實(shí)現(xiàn)重置ip/域名六、實(shí)現(xiàn)結(jié)果及結(jié)果分析在運(yùn)行后產(chǎn)生.exe文件雙擊此文件便可運(yùn)行。1.用本機(jī)測(cè)試: Ping TTL即為生存值,每經(jīng)過(guò)一個(gè)路由器值便減少1,因?yàn)闉楸緳C(jī)所以沒(méi)有經(jīng)過(guò)任何一個(gè)路由器,故為最大值128,Time為時(shí)間戳,在本機(jī)變?yōu)?.2.在斷網(wǎng)時(shí)無(wú)法訪問(wèn)百度故拋出異常 Ping 3.聯(lián)網(wǎng)時(shí) Ping 要訪問(wèn)百度用的是域名,先經(jīng)過(guò)轉(zhuǎn)換為ip。因?yàn)樵L問(wèn)百度必然是要經(jīng)過(guò)路由器所以TTL值小于128,時(shí)間戳也會(huì)不一樣。4.重置 當(dāng)不想ping這個(gè)ip或者域名時(shí)單擊這個(gè)“重置”按鈕。七、使用說(shuō)明直接在“ip/域名:”后面的編輯框中輸入ip或者域名,點(diǎn)擊“ping”按鈕即可在下面只讀的藍(lán)色編輯框中顯示回復(fù)的信息。如果不想ping某一個(gè)ip或者域名可以點(diǎn)擊“重置”鍵可再次輸入ip或者域名。因?yàn)榍蹇真I(clear)的設(shè)置問(wèn)題貌似是實(shí)現(xiàn)了清空但在沒(méi)有關(guān)閉的情況下上一次的顯示結(jié)果在下一次還是會(huì)再次顯示。八、課設(shè)小結(jié) TCP/IP這門(mén)課
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國(guó)鋁合金梳狀加熱器行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)海島絲行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025年度工地施工人員健康保險(xiǎn)及意外傷害合同
- 2025年度護(hù)坡工程防水及防滲漏合同范本
- 2025年度圓管涵工程材料采購(gòu)及供應(yīng)合同
- 2025年度環(huán)保項(xiàng)目居間合同標(biāo)的交付與物權(quán)轉(zhuǎn)移實(shí)施辦法
- 2025年度建筑廢棄物回收利用合同樣本
- 2025年度公司股份委托管理合同范本
- 二零二五版農(nóng)場(chǎng)租賃合同范本:農(nóng)業(yè)科技研發(fā)租賃合同
- 2025年度新能源汽車(chē)充電樁建設(shè)與運(yùn)營(yíng)合作合同
- 2024年版古董古玩買(mǎi)賣(mài)合同:古玩交易稅費(fèi)及支付規(guī)定
- 幼兒園費(fèi)用報(bào)銷(xiāo)管理制度
- 【7歷期末】安徽省宣城市2023-2024學(xué)年七年級(jí)上學(xué)期期末考試歷史試題
- 春節(jié)后安全生產(chǎn)開(kāi)工第一課
- 2025光伏組件清洗合同
- 電力電纜工程施工組織設(shè)計(jì)
- 2024年網(wǎng)格員考試題庫(kù)完美版
- 《建筑與市政工程防水規(guī)范》解讀
- 審計(jì)合同終止協(xié)議書(shū)(2篇)
- 2024年重慶市中考數(shù)學(xué)試題B卷含答案
- 腰椎間盤(pán)突出癥護(hù)理查房
評(píng)論
0/150
提交評(píng)論