計算機網絡課程報告范文_第1頁
計算機網絡課程報告范文_第2頁
計算機網絡課程報告范文_第3頁
計算機網絡課程報告范文_第4頁
計算機網絡課程報告范文_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

17、接端口.注意:bind()、listen()和accept()函數(shù)一般都用于效勞程序,屬于被動等待點函數(shù),要進行主動的連接需要利用connect()函數(shù).函數(shù)原型:Intconnect(SOCKETs,structsockaddr_in*name,intnamlen)其中s是剛剛建立的Socket,name與namelen的含義與使用方法與bind()相同,用來指定通信對象.連接失敗該函數(shù)會返回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ù)實際上是讀取send()函數(shù)發(fā)過來的一個數(shù)據(jù)包.當讀到的數(shù)據(jù)字節(jié)少于規(guī)定接收的數(shù)目時,就把數(shù)據(jù)全部接收,并返回實際接收到的字節(jié)數(shù),當讀到的數(shù)據(jù)多于規(guī)定值時,在流方式下剩余的數(shù)據(jù)由下個recv()讀出,在數(shù)據(jù)報文方式下多余的數(shù)據(jù)將被丟棄.這兩個函數(shù)在出錯時都返回SOCKET_ERROR以數(shù)據(jù)報文方式通信的Socket,由于事先不用建立連接,所以可以跳過connect()而直接用recvfrom和sendto兩個函數(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ù)的對象.closesocket():關閉socket.函數(shù)原型:Closesocket(SOCKETs);通信結束,關閉指定的Socketo以上API在調用時的過程如下:Server端

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

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

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

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

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

25、成功;(9)工作結束,顯示運行Ping命令的統(tǒng)計結果.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é)對齊#include"winsock2.h#include"stdlib.h"#include"stdio.h"# defineICMP_ECHO8/ICMP回顯請求#def

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

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

28、024/數(shù)據(jù)包最大長度#definexmalloc(s)HeapA110c(GetProcessHeap(),HEAP_ZERO_MEMORY,(s)分配內存#definexfree(p)HeapFree(GetProcessHeap(),0,(p)解放內存/填充icmp數(shù)據(jù)包voidfill_icmp_data(char*,int);/計算校驗和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中進入該目錄直接使用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;/旨針指向包含主機名、地址列表等信息的結構體intbread,datasize,times;intfromlen=sizeof(from);inttimeout=1000;/超時時間1000msintstatistic=0;/用于統(tǒng)計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);/使用方法不對時顯示提示信息if(argc<2)Usage(argv0);/創(chuàng)立原始套接字sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);/注:為"用發(fā)送接收超時設置(即設置SO_RCVTIMEO,SO_SNDTIMEO),/必須將標志位設為WSA_FLAG_OVERLAPPE

32、D!/創(chuàng)立原始套接字不成功if(sockRaw=INVALID_SOCKET)fprintf(stderr,"WSASocket()failed:%dn",WSAGetLastError();ExitProcess(STATUS_FAILED);/設定發(fā)送超時時間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ù)據(jù)超時時間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);/解析用戶輸入的目標地址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);)/記錄目標主機信息的結構體/地址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;/目標IPdest_ip=inet_ntoa(dest.sin_addr);/除了目標地址,還給出了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,那么用默認數(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ù)包,類型、代碼、標識等fill_icmp_data(icmp_data,datasize);/提示正在ping目標主機fprintf(stdout,nPinging%s.nn,dest_ip);/Ping屢次for(inti=0;i<times;i+)intbwrote;/準備ICMP包頭部數(shù)據(jù)(IcmpHeader*)icmp_data)-&

38、gt;i_cksum=0;/取得以毫秒為單位的計算機啟動后經歷的時間問隔(IcmpHeader*)icmp_data)->timestamp=GetTickCount();(IcmpHeader*)icmp_data)->i_seq=seq_no+;/序歹!J號遞增(IcmpHeader*)icmp_data)->i_cksum=checksum(USHORT*)icmp_data,datasize);/計算校驗和一/發(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+;記錄成功接收響應數(shù)據(jù)包的次數(shù)Sleep(1000);/統(tǒng)計運行Ping命令的統(tǒng)計結果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;/接收應答數(shù)據(jù)bread=/收到響應IP數(shù)據(jù)包后,對其進行解碼intdecode_resp(char*buf,intbytes,structsockaddr_in*from)(IpHeader*iphdr;IcmpHeader*icmphdr;unsignedshortiphdrlen;iphdr=(IpHeader*)buf;iphdrlen=(iphdr->h_len)*4;頭部占幾個節(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ā)送到接收過程的經歷的時間printf("n");return0;)/計算校驗和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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論