計(jì)算機(jī)網(wǎng)絡(luò)課程報(bào)告范文_第1頁
計(jì)算機(jī)網(wǎng)絡(luò)課程報(bào)告范文_第2頁
計(jì)算機(jī)網(wǎng)絡(luò)課程報(bào)告范文_第3頁
計(jì)算機(jī)網(wǎng)絡(luò)課程報(bào)告范文_第4頁
計(jì)算機(jī)網(wǎng)絡(luò)課程報(bào)告范文_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、課程設(shè)計(jì)(論文)任務(wù)書學(xué)院專業(yè)班一、課程設(shè)計(jì)(論文)題目計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)二、課程設(shè)計(jì)(論文)工作自2021年6月日起至2021年6月日止.三、課程設(shè)計(jì)(論文)地點(diǎn):四、課程設(shè)計(jì)(論文)內(nèi)容要更1 .本課程設(shè)計(jì)的目的通過課程設(shè)計(jì),使學(xué)生理論聯(lián)系實(shí)際,在實(shí)踐中進(jìn)一步了解計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu),深入理解TCP/IP參考模型,掌握各種網(wǎng)絡(luò)工程技術(shù)和網(wǎng)絡(luò)規(guī)劃與設(shè)計(jì),初步掌握綜合布線技術(shù)、高速局域網(wǎng)技術(shù)、廣域網(wǎng)接入技術(shù)、網(wǎng)絡(luò)互聯(lián)技術(shù),初步掌握網(wǎng)絡(luò)應(yīng)用程序開發(fā)技術(shù)以及互聯(lián)網(wǎng)的應(yīng)用技術(shù).培養(yǎng)學(xué)生分析、解決問題的水平,提升學(xué)生的科技論文寫作水平.2 .課程設(shè)計(jì)的任務(wù)及要求1)根本要求:(1)熟悉交換機(jī)、路由器等網(wǎng)

2、絡(luò)設(shè)備的功能和使用;(2)掌握網(wǎng)絡(luò)規(guī)劃與設(shè)計(jì),掌握網(wǎng)絡(luò)平安與治理技術(shù);(3)初步掌握網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)技術(shù)和互聯(lián)網(wǎng)應(yīng)用技術(shù).2)課程設(shè)計(jì)論文編寫要求(1)理論設(shè)計(jì)局部以課程設(shè)計(jì)論文的形式提交,格式必須根據(jù)課程設(shè)計(jì)論文標(biāo)準(zhǔn)格式進(jìn)行書寫和裝訂.(2)課程設(shè)計(jì)報(bào)告(論文)包括目錄、緒論、正文、設(shè)計(jì)小結(jié)、參考文獻(xiàn)、附錄等3)課程設(shè)計(jì)評(píng)分標(biāo)準(zhǔn):(1)考勤與學(xué)習(xí)態(tài)度:20分(2)理論理解與課程設(shè)計(jì)報(bào)告論文:40分;(3)動(dòng)手操作與實(shí)驗(yàn)設(shè)計(jì):20分;(4)設(shè)計(jì)論文辯論:20分.4)參考文獻(xiàn):(1)?計(jì)算機(jī)網(wǎng)絡(luò)(第四版)?主編:謝希仁出版社:電子工業(yè)出版社出版時(shí)間:2004年7月(2)?計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)?主編

3、:吳功宜胡曉英張仁何云王寧出版社:機(jī)械工業(yè)出版社出版或修訂時(shí)間:2005年9月(3)?計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)?主編:易建勛出版社:人民郵電出版社出版或修訂時(shí)間:2007年10月5課程設(shè)計(jì)進(jìn)度安排1.選擇設(shè)計(jì)題目、了解設(shè)計(jì)目的要求、查閱相關(guān)理論資料1圖書館、機(jī)房2.設(shè)計(jì)方案選型及實(shí)驗(yàn)室完成相關(guān)的設(shè)計(jì)任務(wù)2天實(shí)驗(yàn)室3.總結(jié)課程設(shè)計(jì)任務(wù)和設(shè)計(jì)步驟,撰寫課程設(shè)計(jì)論文2天圖書館、機(jī)房、實(shí)驗(yàn)室學(xué)生簽名:2021年6月18日6選擇課程設(shè)計(jì)題目具體要求:用winsock設(shè)計(jì)Ping應(yīng)用程序理解winsock技術(shù)網(wǎng)絡(luò)編程技術(shù),分析PING應(yīng)用程序設(shè)計(jì)原理和程序流程,選擇適宜的開發(fā)環(huán)境,參考已有的PING程序功能,設(shè)計(jì)實(shí)

4、現(xiàn)ping功能的應(yīng)用程序.設(shè)計(jì)論文要求:1分析winsock編程技術(shù);2分析ping程序的功能及其相關(guān)網(wǎng)絡(luò)協(xié)議;3給出ping程序流程圖和設(shè)計(jì)方案;4選擇開發(fā)環(huán)境,編譯源程序;5給出軟件測(cè)試文檔;6設(shè)計(jì)小結(jié);7參考文獻(xiàn)包括互聯(lián)網(wǎng)上的引用信息.()1考勤與學(xué)習(xí)態(tài)度20分:優(yōu)、良、中、一般、差();2理論理解與課程設(shè)計(jì)報(bào)告論文40分:優(yōu)、良、中、T、差;3動(dòng)手操作與實(shí)驗(yàn)設(shè)計(jì)20分、f(1、差;4設(shè)計(jì)論文辯論20分:優(yōu)、良、中、一般、差;(5)職稱:講師2021年6月24日1 .緒論.01.1. 課程設(shè)計(jì)的目的及意義01.2. 課程設(shè)計(jì)的任務(wù)及要求01.3. 課程設(shè)計(jì)題目具體要求02 .Winsoc

5、k編程技術(shù)1.2.1. Winsock的根本概念12.2. Winsock編程的特點(diǎn)12.3. Winsock根本的API13 .ping程序的功能及其相關(guān)網(wǎng)絡(luò)協(xié)議5.3.1. ping程序的功能53.2. ping的相關(guān)協(xié)議54 .ping程序的設(shè)計(jì)方案6.4.1. ping程序的工作流程64.2. 選擇開發(fā)環(huán)境,編譯源程序75 .軟件測(cè)試1.26 .設(shè)計(jì)小結(jié)1.27 .參考文獻(xiàn)1.41 .緒論1.1. 課程設(shè)計(jì)的目的及意義通過課程設(shè)計(jì),使學(xué)生理論聯(lián)系實(shí)際,在實(shí)踐中進(jìn)一步了解計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu),深入理解TCP/IP參考模型,掌握各種網(wǎng)絡(luò)工程技術(shù)和網(wǎng)絡(luò)規(guī)劃與設(shè)計(jì),初步掌握綜合布線技術(shù)、高速局域

6、網(wǎng)技術(shù)、廣域網(wǎng)接入技術(shù)、網(wǎng)絡(luò)互聯(lián)技術(shù),初步掌握網(wǎng)絡(luò)應(yīng)用程序開發(fā)技術(shù)以及互聯(lián)網(wǎng)的應(yīng)用技術(shù).培養(yǎng)學(xué)生分析、解決問題的水平,提升學(xué)生的科技論文寫作水平.1.2. 課程設(shè)計(jì)的任務(wù)及要求1根本要求:1熟悉交換機(jī)、路由器等網(wǎng)絡(luò)設(shè)備的功能和使用;2掌握網(wǎng)絡(luò)規(guī)劃與設(shè)計(jì),掌握網(wǎng)絡(luò)平安與治理技術(shù);3初步掌握網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì)技術(shù)和互聯(lián)網(wǎng)應(yīng)用技術(shù).2課程設(shè)計(jì)論文編寫要求1理論設(shè)計(jì)局部以課程設(shè)計(jì)論文的形式提交,格式必須根據(jù)課程設(shè)計(jì)論文標(biāo)準(zhǔn)格式進(jìn)行書寫和裝訂.2課程設(shè)計(jì)報(bào)告論文包括目錄、緒論、正文、設(shè)計(jì)小結(jié)、參考文獻(xiàn)、附錄等1.3. 課程設(shè)計(jì)題目具體要求用winsock設(shè)計(jì)Ping應(yīng)用程序:理解winsock技術(shù)網(wǎng)絡(luò)編程

7、技術(shù),分析PING應(yīng)用程序設(shè)計(jì)原理和程序流程,選擇適宜的開發(fā)環(huán)境,參考已有的PING程序功能,設(shè)計(jì)實(shí)現(xiàn)ping功能的應(yīng)用程序.設(shè)計(jì)論文要求:1分析winsock編程技術(shù);2分析ping程序的功能及其相關(guān)網(wǎng)絡(luò)協(xié)議;3給出ping程序流程圖和設(shè)計(jì)方案;4選擇開發(fā)環(huán)境,編譯源程序;5給出軟件測(cè)試文檔;6設(shè)計(jì)小結(jié);7參考文獻(xiàn)包括互聯(lián)網(wǎng)上的引用信息.2. Winsock編程技術(shù)2.1. Winsock的根本概念Socket在英文中是插座的意思,他的設(shè)計(jì)者實(shí)際上是暗指插座.由于在Socket環(huán)境下編程很像是模擬打,Internet的IP地址就是號(hào),要打,需要插座,在程序中就是向系統(tǒng)申請(qǐng)一個(gè)Socket,以

8、后兩臺(tái)機(jī)器上的程序“交談都是通過這個(gè)Socket來進(jìn)行的.對(duì)程序員來說,也可以把Socket看成一個(gè)文件指針,只要向指針?biāo)傅奈募x寫數(shù)據(jù),就可以實(shí)現(xiàn)雙向通信.利用Socket進(jìn)行通信,有兩種主要的方式.第一種是面向連接的流方式.顧名思義,在這種方式下,兩個(gè)通信的應(yīng)用程序之間要先建立一種連接鏈路,具過程好似在打.一臺(tái)計(jì)算機(jī)()要想和另一臺(tái)計(jì)算機(jī)()進(jìn)行數(shù)據(jù)傳輸(通話),必須先獲得一條鏈路,只有確定了這條通路之后,數(shù)據(jù)(通話)才能被正確接受和發(fā)送.這種方式對(duì)應(yīng)的是TCPB議.第二種叫做無連接的數(shù)據(jù)報(bào)文方式,這時(shí)兩臺(tái)計(jì)算機(jī)像是把數(shù)據(jù)放在一個(gè)信封里,通過網(wǎng)絡(luò)寄給對(duì)方,信在傳輸?shù)倪^程種有可能會(huì)殘缺不全

9、,而且后發(fā)出的信也有可能會(huì)先收到,它對(duì)應(yīng)的是UDPft、議.流方式的特點(diǎn)是通信可靠,對(duì)數(shù)據(jù)有校驗(yàn)和重發(fā)機(jī)制,通常用來做數(shù)據(jù)文件的傳輸,如FTRTelnet等;數(shù)據(jù)報(bào)文方式由于取消了重發(fā)校驗(yàn)機(jī)制,能夠打到較高的通信速率,可以用于數(shù)據(jù)可靠性要求不高的通信,如實(shí)時(shí)的語音、圖像傳送和關(guān)波消息等.在ISO的OSI網(wǎng)絡(luò)七層協(xié)議中,Winsock主要負(fù)責(zé)的是限制數(shù)據(jù)的輸入和輸出,也就是傳輸層和網(wǎng)絡(luò)層.Winsock屏蔽了數(shù)據(jù)鏈路層和物理層,它的出現(xiàn)給Windows下的網(wǎng)絡(luò)編程帶來了巨大的變化.2.2. Winsock編程的特點(diǎn)在網(wǎng)絡(luò)通信中,由于網(wǎng)絡(luò)擁擠或一次發(fā)送的數(shù)據(jù)量過大等原因,經(jīng)常會(huì)發(fā)生交換的數(shù)據(jù)在短時(shí)

10、間內(nèi)不能傳送完,收發(fā)數(shù)據(jù)的函數(shù)因此不能返回的現(xiàn)象,這種現(xiàn)象叫做阻塞.Winsock對(duì)有可能阻塞的函數(shù)提供了兩種處理方式一一阻塞和非阻塞方式.在阻塞方式下,收發(fā)數(shù)據(jù)的函數(shù)在被調(diào)用后一直要到傳送完畢或者出錯(cuò)才能返回;在阻塞期間,除了等待網(wǎng)絡(luò)操作的完成不能進(jìn)行任何操作.對(duì)于非阻塞方式,函數(shù)被調(diào)用后立即返回;當(dāng)網(wǎng)絡(luò)操作傳送完成后,由Winsock給應(yīng)用程序發(fā)送一個(gè)消息,通知操作完成,此時(shí)可以根據(jù)發(fā)送的消息的參數(shù)判斷操作是否正常.在編程時(shí),應(yīng)盡量使用非阻塞方式.由于在阻塞方式下,用戶可能會(huì)由于長時(shí)間的等待而失去耐心繼而關(guān)閉應(yīng)用程序的主窗口,這樣當(dāng)網(wǎng)絡(luò)操作的函數(shù)從Winsock的動(dòng)態(tài)鏈接庫中返回時(shí),主程序

11、已經(jīng)從內(nèi)存中刪除,可能會(huì)造成內(nèi)存的異常,雖然現(xiàn)在的操作系統(tǒng)已經(jīng)可以從系統(tǒng)級(jí)正確地處理這種內(nèi)存問題,但還是建議這種情況的發(fā)生.2.3. Winsock根本的API(1)WSAStartup():初始化.函數(shù)原型:IntPASCALFARWSAStartup(WORDwVersionRequested,LPWSDATAlpWSAData);WindowsSocket由DLL形式提供,為了完成一系列初始化操作,每一個(gè)使用WindowsSocket的應(yīng)用程序都必須進(jìn)行WSASstartup()函數(shù)調(diào)用,并只有在成功地完成調(diào)用之后才能使用Socketo其中參數(shù)wVersionRequested表示欲使用

12、的WindowsSocketAPI的版本:這是一個(gè)WORD型的整數(shù),它的高位字節(jié)定義是次版本號(hào),低位字節(jié)定義的是主版本號(hào).IpWSAData指向WSADA做料的指針.成功返回0.(2)socket();創(chuàng)立一個(gè)Socket.函數(shù)原型:SOCKETsocketintaf,inttype,intproctocol);所有的通信在建立之前都要?jiǎng)?chuàng)立一個(gè)Socket,該函數(shù)的功能與文件操作中的fopen類似.Af值addressfamily(地址族),一般都填A(yù)F_INET表示是在Internet上的Socket;type是Socket的類型,當(dāng)采用流連接方式時(shí)用SOCK_STREAM數(shù)據(jù)報(bào)文方式時(shí)用S

13、OCK_DGRAProctocol一般都為0,表示用對(duì)兩種類型的Socket分別采用缺省的TC講口UDP專輸協(xié)議.函數(shù)的返回值是由Winsock訂id一種數(shù)據(jù)類型SOCKET它實(shí)際上就是個(gè)整型數(shù)據(jù)在Socket創(chuàng)立成功時(shí),代表Winsock分配給程序的Socket編號(hào),后面調(diào)用傳輸函數(shù)時(shí),就可以把它像文件指針一樣引用.如果Socket建立失敗,返回值為INVALID_SOCKET(3)bind();創(chuàng)立的Socket指定通信對(duì)象.函數(shù)原型:Intbind(SOCKETs,conststructsocketsockaddr_in*addr,intaddrlen);創(chuàng)立了Socket之后,就應(yīng)該選

14、定通信的對(duì)象.首先是自己的程序要與網(wǎng)上的哪臺(tái)計(jì)算機(jī)通話;其次,在多任務(wù)的系統(tǒng)下,該計(jì)算機(jī)上可能會(huì)有幾個(gè)程序在工作,必須指出要與哪個(gè)程序通信.前者可以通過Internet的網(wǎng)絡(luò)IP地址來確定,而后者是通過端口號(hào)來確定.用端口號(hào)來表示同一臺(tái)計(jì)算機(jī)上不同的應(yīng)用程序,端口號(hào)可以為065536,不同功能的通信程序使用不同的端口號(hào),這樣一臺(tái)計(jì)算機(jī)上可以有幾個(gè)程序同時(shí)使用一個(gè)IP地址通信而不互相干擾,IP地址與端口號(hào)的關(guān)系好似是總機(jī)號(hào)與分機(jī)號(hào)的關(guān)系一樣.listen():設(shè)置等待連接狀態(tài).函數(shù)原型:Intlisten(SOCKETs,intbacklog);對(duì)于效勞器的程序,當(dāng)中請(qǐng)到Socket,并指定通信

15、對(duì)象為INADDR_ANY后,就應(yīng)該等待一個(gè)客戶機(jī)的程序來要求連接.Listen()就是一個(gè)把一個(gè)Socket設(shè)置這種狀態(tài)的函數(shù).參數(shù)backlog是等待連接的隊(duì)列長度,可取15.如果當(dāng)某個(gè)客戶程序要求連接時(shí),效勞器已與其他客戶程序連接,那么后來的連接請(qǐng)求會(huì)被放在隊(duì)列中,等待效勞器空閑的時(shí)候再與之連接.當(dāng)隊(duì)歹J到達(dá)指定的長度(backlog的值)時(shí),再來的連接請(qǐng)求都將被拒絕.(5)accept():接受連接請(qǐng)求.函數(shù)原型:SOCKETaccept(SOCKETs,structsockaddr_in*addr,int*addrlen);當(dāng)沒有連接請(qǐng)求時(shí),對(duì)于阻塞方式,就進(jìn)入等待狀態(tài),直至有一個(gè)請(qǐng)

16、求到達(dá)為止.Accept()在接受到連接請(qǐng)求之后,會(huì)為這個(gè)連接建立一個(gè)新的Socket來與對(duì)方通信,并把它作為返回值.新建的Socket與原來的Socket有相同的特性,包括端口號(hào).原來的Socket被釋放,用于繼續(xù)等待其他的連接請(qǐng)求,而生成的Socket才是與客戶端進(jìn)行通信的實(shí)際Socketo所以一般將參數(shù)中的SOCKET作“監(jiān)聽"Socket,它只負(fù)責(zé)接受連接,而不負(fù)責(zé)通話;而對(duì)于accept函數(shù)返回的SOCKET把它稱作“會(huì)話Socket,它只負(fù)責(zé)與客戶端通話.參數(shù)中的指針addr和addlen用來返回客戶機(jī)的sockaddr-in結(jié)構(gòu)體,夠過addr可得到客戶機(jī)的IP地址和連

17、接端口.注意:bind()、listen()和accept()函數(shù)一般都用于效勞程序,屬于被動(dòng)等待點(diǎn)函數(shù),要進(jìn)行主動(dòng)的連接需要利用connect()函數(shù).函數(shù)原型:Intconnect(SOCKETs,structsockaddr_in*name,intnamlen)其中s是剛剛建立的Socket,name與namelen的含義與使用方法與bind()相同,用來指定通信對(duì)象.連接失敗該函數(shù)會(huì)返回SOCKET-ERROR.(6)send()/recv():發(fā)送、接收數(shù)據(jù).函數(shù)原型:Intsend(SOCKETs,char*buf,intlen,intflags)Intrecv(SOCKETs,c

18、har*buf,intlen,intflags)S是連接用的.Socket>buf和len是發(fā)送或接收的的數(shù)據(jù)包及其長度,參數(shù)flags一般取0.recv()函數(shù)實(shí)際上是讀取send()函數(shù)發(fā)過來的一個(gè)數(shù)據(jù)包.當(dāng)讀到的數(shù)據(jù)字節(jié)少于規(guī)定接收的數(shù)目時(shí),就把數(shù)據(jù)全部接收,并返回實(shí)際接收到的字節(jié)數(shù),當(dāng)讀到的數(shù)據(jù)多于規(guī)定值時(shí),在流方式下剩余的數(shù)據(jù)由下個(gè)recv()讀出,在數(shù)據(jù)報(bào)文方式下多余的數(shù)據(jù)將被丟棄.這兩個(gè)函數(shù)在出錯(cuò)時(shí)都返回SOCKET_ERROR以數(shù)據(jù)報(bào)文方式通信的Socket,由于事先不用建立連接,所以可以跳過connect()而直接用recvfrom和sendto兩個(gè)函數(shù)通信:Intre

19、cvfrom(SOCKETs,char*buf,intlen,intflags,structsocket_infrom,int*fromlen);Intsendto(SOCKETs,char*buf,intlen,intflags,structsockaddr_into,int*tolen)其中from、fromlen、to、tolen的含義和用法與bind()和connect()中的相同,分別表示接收和發(fā)送數(shù)據(jù)的對(duì)象.closesocket():關(guān)閉socket.函數(shù)原型:Closesocket(SOCKETs);通信結(jié)束,關(guān)閉指定的Socketo以上API在調(diào)用時(shí)的過程如下:Server端

20、Client端圖1面向連接的流方式過程圖2面向無連接的數(shù)據(jù)報(bào)過程3. ping程序的功能及其相關(guān)網(wǎng)絡(luò)協(xié)議3.1. ping程序的功能Ping程序通過主機(jī)向遠(yuǎn)程計(jì)算機(jī)發(fā)出ICMP回顯請(qǐng)求,遠(yuǎn)程計(jì)算機(jī)攔截這個(gè)請(qǐng)求,然后生成一條回顯應(yīng)答消息,通過網(wǎng)絡(luò)傳給主機(jī).但是如果由于一些原因造成不能抵達(dá)目標(biāo)主機(jī),就會(huì)生成對(duì)應(yīng)的ICMP錯(cuò)誤消息,由原來打算建立通信的那個(gè)路徑上某處的一個(gè)路由器返回.如果與遠(yuǎn)程主機(jī)的物理性連接并不存在問題,但是遠(yuǎn)程主機(jī)已經(jīng)關(guān)機(jī)或沒有設(shè)置對(duì)網(wǎng)絡(luò)時(shí)間的做出相應(yīng),便需由自己的程序來執(zhí)行超時(shí)檢測(cè),偵測(cè)出這樣的情況.以檢查網(wǎng)絡(luò)是否能夠連通,從而可以很好地幫助我們分析判定網(wǎng)絡(luò)故障.它所利用的原理

21、是這樣的:網(wǎng)絡(luò)上的機(jī)器都有唯一確定的IP地址,根據(jù)缺省設(shè)置,Windows上運(yùn)行的Ping命令給目標(biāo)IP地址發(fā)送4個(gè)ICMP網(wǎng)間限制報(bào)文協(xié)議回送請(qǐng)求,每個(gè)32字節(jié)數(shù)據(jù),如果一切正常,應(yīng)能得到4個(gè)回送應(yīng)答.根據(jù)返回的數(shù)據(jù)包我們可以確定目標(biāo)主機(jī)的存在以及是否可達(dá).在本程序中,可以通過兩種方式測(cè)試目標(biāo)主機(jī)的連通性:通過ip地址或者主機(jī)名.前者較簡單,假設(shè)通過主機(jī)名測(cè)試連通性的話,首先要通過數(shù)據(jù)庫中的地址主機(jī)名表查詢并解析其對(duì)應(yīng)的ip地址,然后進(jìn)一步測(cè)試連通性.如果可以正常連通,那么根據(jù)先后的順序返回4個(gè)應(yīng)答幀,顯示所用的時(shí)間,并且提示完成ping測(cè)試.另外還可以通過復(fù)選框簡單的記錄路由器的情況.如果

22、不能正常連通,那么顯示timeout,并提示測(cè)試完成.3.2. ping的相關(guān)協(xié)議支持Ping的協(xié)議中ICMP是最關(guān)鍵的一個(gè).ICMP全稱InternetControlMessageProtocol網(wǎng)際限制信息協(xié)議.在網(wǎng)絡(luò)體系結(jié)構(gòu)的各層次中,都需要限制,而不同的層次有不同的分工和限制內(nèi)容,IP層的限制功能是最復(fù)雜的,主要負(fù)責(zé)過失限制、擁塞限制等,任何限制都是建立在信息的根底之上的,在基于IP數(shù)據(jù)報(bào)的網(wǎng)絡(luò)體系中,網(wǎng)關(guān)必須自己處理數(shù)據(jù)報(bào)的傳輸工作,而IP協(xié)議自身沒有內(nèi)在機(jī)制來獲取過失信息并處理.為了處理這些錯(cuò)誤,TCP/IP設(shè)計(jì)了ICMP協(xié)議,當(dāng)某個(gè)網(wǎng)關(guān)發(fā)現(xiàn)傳輸錯(cuò)誤時(shí),立即向信源主機(jī)發(fā)送ICMP報(bào)

23、文,報(bào)告出錯(cuò)信息,讓信源主機(jī)采取相應(yīng)處理舉措,它是一種過失和限制報(bào)文協(xié)議,不僅用于傳輸過失報(bào)文,還傳輸限制報(bào)文.ICMP報(bào)文包含在IP數(shù)據(jù)報(bào)中,屬于IP的一個(gè)用戶,IP頭部就在ICMP報(bào)文的前面,所以一個(gè)ICMP®文包括IP頭部、ICMP頭部和ICMP報(bào)文,IP頭部的Protocol值為1就說明這是一個(gè)ICMP報(bào)文,ICMP頭部中的類型Type域用于說明ICMP報(bào)文的作用及格式,此外還有一個(gè)代碼Code域用于詳細(xì)說明某種ICMP報(bào)文的類型,所有數(shù)據(jù)都在ICMP頭部后面.常見的ICMP報(bào)文主要有:響應(yīng)請(qǐng)求目標(biāo)不可到達(dá)、源抑制和超時(shí)報(bào)文,以及時(shí)間戳.4. ping程序的設(shè)計(jì)方案5. 1.

24、ping程序的工作流程設(shè)計(jì)方案:(1)ping兩臺(tái)主機(jī)要發(fā)送消息,源主機(jī)要有發(fā)送區(qū)和接收區(qū),因此要為send_buf和recv_buf分配內(nèi)存;(2)創(chuàng)立icmp的包頭;(3)編寫算法用于計(jì)算icmp包的校驗(yàn)和,但在校驗(yàn)之前務(wù)必將icmp包頭的checksum字段置為0;(4)初始化rawsocket,設(shè)置ttl,初始化dest,如果返回值為0表示失??;(5)初始化icmp的包頭,給data局部填充數(shù)據(jù),最后計(jì)算整個(gè)包的檢驗(yàn)和;(6)發(fā)送生成的icmp包,返回值小于0,表示失?。唤邮読cmp包,返回值小于0,表示失?。?8)對(duì)收到的icmp解碼,如果返回值為-2,表示忽略,-1表示失敗,0表示

25、成功;(9)工作結(jié)束,顯示運(yùn)行Ping命令的統(tǒng)計(jì)結(jié)果.6. 2.選擇開發(fā)環(huán)境,編譯源程序我選擇了VC6.0的開發(fā)環(huán)境,并且創(chuàng)立工程ping和cpp文件iping.cpp,并由以下代碼編譯出可執(zhí)行文件iping.exe./aprogamwrittenby225#pragmacomment(lib,"ws2_32.lib")#pragmapack(4)/總節(jié)對(duì)齊#include"winsock2.h#include"stdlib.h"#include"stdio.h"# defineICMP_ECHO8/ICMP回顯請(qǐng)求#def

26、ineICMP_ECHOREPLY0/ICMP回顯應(yīng)答# defineICMP_MIN8/ICMP數(shù)據(jù)包最短為8個(gè)字節(jié)/定義IP頭部typedefstructiphdrunsignedinth_len:4;/頭部長unsignedintversion:4;/版本號(hào)unsignedchartos;/月艮務(wù)類型unsignedshortident;/標(biāo)識(shí)unsignedshorttotal_len;/總長度unsignedshortfrag_and_flags;版志unsignedcharttl;/件存時(shí)間unsignedcharproto;/上層協(xié)議unsignedshortchecksum;校

27、驗(yàn)和unsignedintsourceIP;頒IPunsignedintdestIP;/B的IPIpHeader;/定義ICMP頭部typedefstructicmphdrBYTEi_type;類型BYTEi_code;代碼USHORTi_cksum;/校驗(yàn)和USHORTi_id;/標(biāo)識(shí)USHORTi_seq;/吐歹U號(hào)ULONGtimestamp;/數(shù)據(jù)IcmpHeader;# defineSTATUS_FAILED0xFFFF#defineDEF_PACKET_SIZE32/# defineDEF_PACKET_NUMBER4/默認(rèn)發(fā)送ICMP請(qǐng)求的次數(shù)#defineMAX_PACKET1

28、024/數(shù)據(jù)包最大長度#definexmalloc(s)HeapA110c(GetProcessHeap(),HEAP_ZERO_MEMORY,(s)分配內(nèi)存#definexfree(p)HeapFree(GetProcessHeap(),0,(p)解放內(nèi)存/填充icmp數(shù)據(jù)包voidfill_icmp_data(char*,int);/計(jì)算校驗(yàn)和USHORTchecksum(USHORT*,int);/收到數(shù)據(jù)后解碼intdecode_resp(char*,int,structsockaddr_in*);/提示用戶該程序使用方法voidUsage(char*progname)fprintf(

29、stderr,"t命令所在目錄:n");fprintf(stderr,"t%sn",progname);printf("t你需要在cmd中進(jìn)入該目錄直接使用iping指令,例如:ipingbaidun");ExitProcess(STATUS_FAILED);intmain(intargc,char*argv)system("cls");printf("nnn=AsmallprogramwritenbyXXXXXXXX=n");WSADATAwsaData;/創(chuàng)始化windowssocket需要

30、的參數(shù)SOCKETsockRaw;原始套接字structsockaddr_indest,from;/源、目的IP地址structhostent*hp;/旨針指向包含主機(jī)名、地址列表等信息的結(jié)構(gòu)體intbread,datasize,times;intfromlen=sizeof(from);inttimeout=1000;/超時(shí)時(shí)間1000msintstatistic=0;/用于統(tǒng)計(jì)char*dest_ip;char*icmp_data;char*recvbuf;unsignedintaddr=0;USHORTseq_no=0;if(WSAStartup(MAKEWORD(2,1),&w

31、saData)!=0)fprintf(stderr,"WSAStartupfailed:%dn",GetLastError();ExitProcess(STATUS_FAILED);/使用方法不對(duì)時(shí)顯示提示信息if(argc<2)Usage(argv0);/創(chuàng)立原始套接字sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);/注:為"用發(fā)送接收超時(shí)設(shè)置(即設(shè)置SO_RCVTIMEO,SO_SNDTIMEO),/必須將標(biāo)志位設(shè)為WSA_FLAG_OVERLAPPE

32、D!/創(chuàng)立原始套接字不成功if(sockRaw=INVALID_SOCKET)fprintf(stderr,"WSASocket()failed:%dn",WSAGetLastError();ExitProcess(STATUS_FAILED);/設(shè)定發(fā)送超時(shí)時(shí)間bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)fprintf(stderr,"failedtosetrecvtimeout:%dn"

33、;,WSAGetLastError();ExitProcess(STATUS_FAILED);/設(shè)定接收數(shù)據(jù)超時(shí)時(shí)間timeout=1000;bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout);if(bread=SOCKET_ERROR)fprintf(stderr,"failedtosetsendtimeout:%dn",WSAGetLastError();ExitProcess(STATUS_FAILED);memset(&dest,0,sizeo

34、f(dest);/解析用戶輸入的目標(biāo)地址hp=gethostbyname(argv1);if(!hp)addr=inet_addr(argv1);datasize=atoi(argv3);)/非法輸入if(!hp)&&(addr=INADDR_NONE)fprintf(stderr,"Unabletoresolve%sn",argv1);ExitProcess(STATUS_FAILED);)/記錄目標(biāo)主機(jī)信息的結(jié)構(gòu)體/地址if(hp!=NULL)memcpy(&(dest.sin_addr),hp->h_addr,hp->h_lengt

35、h);elsedest.sin_addr.s_addr=addr;/協(xié)議族if(hp)dest.sin_family=hp->h_addrtype;elsedest.sin_family=AF_INET;/目標(biāo)IPdest_ip=inet_ntoa(dest.sin_addr);/除了目標(biāo)地址,還給出了Ping的次數(shù)if(argc>2)times=atoi(argv2);if(times=0)times=DEF_PACKET_NUMBER;)elsetimes=DEF_PACKET_NUMBER;/還給出了數(shù)據(jù)大小if(argc>3)/給的是0,那么用默認(rèn)數(shù)據(jù)包大小if(da

36、tasize=0)datasize=DEF_PACKET_SIZE;/用戶給出的數(shù)據(jù)包大小太大if(datasize>1024)fprintf(stderr,"WARNING:data_sizeistoolarge!n");datasize=DEF_PACKET_SIZE;)elsedatasize=DEF_PACKET_SIZE;datasize+=sizeof(IcmpHeader);icmp_data=(char*)xmalloc(MAX_PACKET);recvbuf=(char*)xmalloc(MAX_PACKET);if(!icmp_data)fprin

37、tf(stderr,"HeapA110cfailed%dn",GetLastError();ExitProcess(STATUS_FAILED);)memset(icmp_data,0,MAX_PACKET);/填充ICMP數(shù)據(jù)包,類型、代碼、標(biāo)識(shí)等fill_icmp_data(icmp_data,datasize);/提示正在ping目標(biāo)主機(jī)fprintf(stdout,nPinging%s.nn,dest_ip);/Ping屢次for(inti=0;i<times;i+)intbwrote;/準(zhǔn)備ICMP包頭部數(shù)據(jù)(IcmpHeader*)icmp_data)-&

38、gt;i_cksum=0;/取得以毫秒為單位的計(jì)算機(jī)啟動(dòng)后經(jīng)歷的時(shí)間問隔(IcmpHeader*)icmp_data)->timestamp=GetTickCount();(IcmpHeader*)icmp_data)->i_seq=seq_no+;/序歹!J號(hào)遞增(IcmpHeader*)icmp_data)->i_cksum=checksum(USHORT*)icmp_data,datasize);/計(jì)算校驗(yàn)和一/發(fā)送ICMP數(shù)據(jù)包bwrote=sendto(sockRaw,icmp_data,datasize,0,(structsockaddr*)&dest,s

39、izeof(dest);/發(fā)送失敗if(bwrote=SOCKET_ERROR)if(WSAGetLastError()=WSAETIMEDOUT)printf("Requesttimedout.n");continue;fprintf(stderr,"sendtofailed:%dn",WSAGetLastError();ExitProcess(STATUS_FAILED);if(bwrote<datasize)fprintf(stdout,"Wrote%dbytesn",bwrote);recvfrom(sockRaw,re

40、cvbuf,MAX_PACKET,0,(structsockaddr*)&from,&fromlen);/接收失敗if(bread=SOCKET_ERROR)if(WSAGetLastError()=WSAETIMEDOUT)printf("Requesttimedout.n");continue;fprintf(stderr,"recvfromfailed:%dn",WSAGetLastError();ExitProcess(STATUS_FAILED);/成功解碼if(!decode_resp(recvbuf,bread,&f

41、rom)statistic+;記錄成功接收響應(yīng)數(shù)據(jù)包的次數(shù)Sleep(1000);/統(tǒng)計(jì)運(yùn)行Ping命令的統(tǒng)計(jì)結(jié)果fprintf(stdout,"nPingstatisticsfor%sn",dest_ip);fprintf(stdout,"Packets:Sent=%d,Received=%d,Lost=%d(%2.0f%loss)n",times,statistic,(times-statistic),(float)(times-statistic)/times*100);printf("n=AsmallprogramwritenbyXXX

42、XXXXX=n");WSACleanup();return0;/接收應(yīng)答數(shù)據(jù)bread=/收到響應(yīng)IP數(shù)據(jù)包后,對(duì)其進(jìn)行解碼intdecode_resp(char*buf,intbytes,structsockaddr_in*from)(IpHeader*iphdr;IcmpHeader*icmphdr;unsignedshortiphdrlen;iphdr=(IpHeader*)buf;iphdrlen=(iphdr->h_len)*4;頭部占幾個(gè)節(jié)字節(jié)一if(bytes<iphdrlen+ICMP_MIN)printf("Toofewbytesfrom%sn

43、",inet_ntoa(from->sin_addr);)一一/找到ICMP數(shù)據(jù)包開始的地方icmphdr=(IcmpHeader*)(buf+iphdrlen);if(icmphdr->i_type!=ICMP_ECHOREPLY)fprintf(stderr,"non-echotype%drecvdn",icmphdr->i_type);return1;)/是不是發(fā)給本程序的數(shù)據(jù)包if(icmphdr->i_id!=(USHORT)GetCurrentProcessId()fprintf(stderr,"someoneelse

44、''spacket!n");return1;)printf("%dbytesfrom%s:",bytes,inet_ntoa(from->sin_addr);printf("icmp_seq=%d.",icmphdr->i_seq);printf("time:%dms",GetTickCount()-icmphdr->timestamp);發(fā)送到接收過程的經(jīng)歷的時(shí)間printf("n");return0;)/計(jì)算校驗(yàn)和USHORTchecksum(USHORT*buffe

45、r,intsize)unsignedlongcksum=0;while(size>1)cksum+=*buffer+;size-=sizeof(USHORT);)if(size)cksum+=*(UCHAR*)buffer;)cksum=(cksum>>16)+(cksum&Oxffff);cksum+=(cksum>>16);return(USHORT)(cksum);)/填充ICMP數(shù)據(jù)包voidfill_icmp_data(char*icmp_data,intdatasize)IcmpHeader*icmp_hdr;char*datapart;icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr->i_type=ICMP_ECHO;icmp_hdr->i_code=0;icmp_hdr->i_id=(USHORT)GetCurrentProcessId();icmp_hdr->i_cksum=0;ic

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論