計算機網絡實驗之Ping程序的設計與實現_第1頁
計算機網絡實驗之Ping程序的設計與實現_第2頁
計算機網絡實驗之Ping程序的設計與實現_第3頁
計算機網絡實驗之Ping程序的設計與實現_第4頁
計算機網絡實驗之Ping程序的設計與實現_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、課程名稱 計算機網絡實驗序號 實驗五實驗項目Ping程序的設計與實現2017年03月25日實驗報告要求1、實驗報告封面填表說明(每份實驗報告必須附上封面)(1)課程名稱:要求與實驗大綱和實驗指導書中的課程名稱一致。(2)實驗序號:指該課程的第幾個實驗。(3)實驗項目:要求與實驗大綱和實驗指導書中的實驗項目一致。(4)實驗地點:填寫完成該實驗項目所在的實驗室名稱。(5)實驗學時:要求與實驗大綱和實驗指導書中完成該實驗項目所需學時一致。(6)實驗類型:是指演示性、操作性、驗證性、綜合性、設計性。演示性:教師操作,學生觀察,驗證理論、說明原理和方法。操作性:學生按要求動手拆裝、調試實驗裝置或上機操作

2、,掌握其基本原理和方法。驗證性:按實驗指導書(教材)要求,由學生通過操作驗證所學理論,加深對理論、 知識的理解,掌握基本實驗知識、方法、技能、數據處理等。綜合性:實驗內容涉及本課程的綜合知識或相關課程的知識,運用多的知識、多種方 法,按要求或自擬實驗方案進行實驗。主要培養學生綜合運用所學知識、實驗方法和實驗 技能,以培養其分析、解決問題的能力。設計性:給定實驗目的、要求和實驗條件,學生自己設計實驗方案并加以實現的實驗。 學生獨立完成從查閱資料、擬定實驗方案、實驗方法和步驟(或系統分析和設計)、選擇儀器設備(或自行設計缺制作)進行實驗并完成實驗全過程,形成實驗報告,培養學生自 主實驗的能力。2、

3、實驗報告的格式軟件類實驗報告格式公共課實驗報告格式硬件類實驗報告格式序 號要求序 號要求序 號要求1實驗目的及要求1實驗目的及要求1實驗預習實驗目的實驗原理及內容(簡明扼要, 主要是實驗接線圖)2實驗原理與內容2實驗步驟所用儀器設備3實驗軟硬件環境3操作要點預習思考題4實驗過程(實驗步驟、 記錄、數據、分析)4實驗結果2實驗原始記 錄(經實驗指 導教師簽名 認可)畫出實驗所需要的各種記錄表格5測t/調試及實驗結果 分析5實驗問題3實驗報告數據處理(數據表格、計算結果、誤差、 結果表達、曲線圖等)6實驗結論與體會6小結及討論結論討論3、教師批改學生實驗報告要求(1)批改:全部批改及更正錯誤。(2

4、)評分:按百分制評分,不能評分為“優、良、中、差”或A、B、C”(3)簽名及批改日期:任課教師必須在每份學生實驗報告中簽名和寫上批改日期(4)成績:填寫學生實驗成績表,實驗成績作為考試成績評定的依據。(4)評語:任課教師批改學生實驗報告時,應給出簡明扼要的評語。成績:教 師 評 語指導教師簽名:批閱日期:一、實驗目的及要求.加深對ICMPB議的理解.熟悉原始套接字的使用方法.掌握PING程序的實現流程二、實驗原理與內容1、一種網絡診斷工具2、發送ICMP回送請求報文3、接收ICMP回送應答報文4、IP報文格式5、WinSock原始套接字的使用方法與API函數Wnsock原始套接字編程過程中,服

5、務器端/客戶端的編程都按照以下步驟:初始化套接字(WSAStartup)創建套接字(socket或 WSASocket)向服務器通信(sendto/recvfrom)關閉套接字(closesocket)結束使用套接字(WSACleanup)6、三種 WinSock地址結構用的Winsock地址結構sockaddr ,針對各種通信域的套接字,存儲它們的地址專門針對Internet 通信域的 Winsock地址結構sockaddr_in 專用于存儲IP地址的結構in_addr三、實驗軟硬件環境運行 Windows XP/ Windows Server 2003/Windows 7 操作系統的 PC

6、臺Visual C+6.0/ Visual Studio 2005/Visual Studio 2010開發環境四、實驗過程(實驗步驟、記錄、數據、分析).打開Visual Studio 2013 ,建立工程文件. 了解需求,進行需求分析:使用winsock原始套接字編寫ping程序,要求實現如下功能:可以指定ping的目標主機IP o每次發送4個ICMP回送請求報文,每個請求報文的數據大小為32字節,發送超時和接收超時時間設為1000ms對于發出的每個ICMP回送請求報文,若收到應答報文,顯示每個應答報文的數據 大小(byte )、源IP、序號、響應時間(ms);若發送超時或接收超時,顯示“

7、Request time out. ”最后,顯示用戶名和ping的統計信息。統計信息包括發出的請求報文個數、收到 的應答報文個數、丟包個數、丟包率。.繪制流程框圖.編寫各個函數代碼塊.編譯,運行實驗代碼如下:(溫馨提醒:意要在.cpp文件的前后添加#include stdafx.h(是預編譯處理器把stdafx.h文件中的內容加載到程序中來。)#include stdafx.h#pragma pack(4)#pragma comment lib ,ws2_32.lib”)#include winsock2.h/#include stdafx.h/增加的頭文#include stdlib.h#i

8、nclude stdio.hdefine ICMP_ECHO / ICMP ECHO 請求報文類型define ICMP_ECHOREPLY/ ICMP ECHO 響應寸艮文類型define ICMP_MIN8 / 最小 ICMP報文大小為 8 bytes ( 只有 ICMP首部)define ICMP_PACKET_SIZE /ICMP 報文數據大小define ICMP_PACKET_NUMBER 發送 ICMP報文的個數define MAX_PACKET024 / 最大 ICMP報文數據長度define ICMP TIMEOUT000/ICMP 超時時間#define xmalloc (

9、s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORYdefine xfree (p) HeapFree (GetProcessHeap(),0,(p)/*定義結卞體:IP首部*/typedef struct iphdr unsigned int h_len : 4;/ 首部長度unsigned int version : 4;/IP 版本unsigned char tos; / 服務類型unsigned short total_len;/ 報文總長度unsigned short ident; / IP 報文標識符unsigned short frag_

10、and_flags; / 分片標記和片偏移unsigned char ttl; / 生存時間unsigned char proto; /報文數據的協議類型unsigned short checksum; / 首部檢驗和unsigned int sourceIP; / 源 IPunsigned int destIP; / 目的 IPIpHeader; I I/*定義結卞體:ICMP首部*/typedef struct icmphdr BYTE_type; / ICMP 報文類型BYTE_code; / 代碼USHORcksum; /報文校驗和USHORid;/ ICMP報文標識符USHORseq

11、;/報文序號ULONGmestamp; /時間戳,不是ICMP報文首部的標準組成部分IcmpHeader;void fill icmp data(char *, int ); / ICMP 請求報文填充函數USHORTiecksum( USHORT int ); / 校驗和計算函數nt decode resp( char *, int , struct sockaddr_in *);/ ICMP 應答報文解析函數nt main( int argc, char * argv)WSADATAsaData; / 套接字信息SOCKETockRaw; /原始套件字char dest ip16;/ 目的

12、 IP (字符串)unsigned int addr = 0;/ 目的 IP (整型)struct sockaddr_in dest;/ 目的 IP (sockaddr_in 結構)struct sockaddr in from;/ 源 socket 地址int fromlen = sizeof (from); / 源 socket 地址的長度int datasize; /報文總長度(=首部大小+數據大小)/int bwrote, bread; /實際發送和接收數據大小int timeout =ICMP_TIMEOU T/ 超時時間USHORseq no = 0; /報文序號從0開始遞增int

13、 statistic = 0;/成功接收報文的個數char *icmp data;/指向發送緩沖區的指針char *recvbuf; /指向接收緩沖區的指針memset(dest_ip, 0 , sizeof (dest_ip);if ( argc 2) printf( Please input destination host IP (請輸入目的 IP):); scanf( %s, &dest_ip); elsememcpy(dest ip, argv 1, strlen( argv1);/*初始化函數*/if (WSAStartup( MAKEWORD2), &wsaData) != 0)

14、/ 第一處Iprintf( WSAStartup failed: %dn, GetLastError();return -1;/*創建彳輸ICMPB議數據的原始套接字*/sockRaw = WSASocketAF_INET SOCK_RAWPPROTO_ICM PNULL 0, WSA_FLAG_OVERLAPPE/DS二/* raw-protocol interface */ 第三處if (sockRaw = INVALID_SOCKET printf( WSASocket() failed: %dn, WSAGetLastError();return -1;/*設置套接字的接收超時選項(即

15、設置SO_RCVTIMEO) */if (setsockopt(sockRaw,SOL SOCKETSO RCVTIME O char *)&timeout, sizeof (timeout)=SOCKET ERRORprintf( failed to set recv timeout: %dn, WSAGetLastError();return -1;/*設置套接字的發送超時選項(即設置SO_SNDTIMEO) */if (setsockopt(sockRaw, SOL_SOCKETSO_SNDTIME O char *)&timeout, sizeof (timeout)= SOCKET_

16、ERRORprintf( failed to set send timeout: %dn, WSAGetLastError();return -1;/*轉換指定的目的IP為winsocket地址結構*/addr = inet addr(dest_ip);/第四處inet_addr()的功能是將一個點分十進制的IP轉換成一個長整數型數(u_long類型)dest.sin addr. s addr = addr;dest.sin_family = AF_INET /*創建發送緩沖區,分配內存*/ datasize = ICMP_PACKET_SIZ-E sizeof (IcmpHeader); i

17、cmp_data = ( char *) xmalloc (MAX_PACKET if (!icmp data) printf( HeapAlloc failed %dn, GetLastError();return -1;/*創建接收緩沖區,分配內存*/ recvbuf = ( char *) xmalloc (MAX_PACKET|if (!recvbuf) | printf( HeapAlloc failed %dn, GetLastError();|return -1;I_/*填充待發送的ICMPi青求報文*/ memset(icmp data, 0,MAX PACKETf川_icmp

18、_data(icmp_data, datasize);/*顯示ping提示信息*/printf( nPinging %s .nn, dest_ip);/*發送4個ICMPi青求報文,并接收應答報文*/ for ( int i = 0; ii_cksum = 0;/ 校驗和字段置 0(IcmpHeader*)icmp_data)-timestamp = GetTickCount(); / 時間戳字段置為當前系統時間(IcmpHeader*)icmp_data)-i_seq = seq_no+; / 序號字段每次遞增 1(IcmpHeader*)icmp_data)-i_cksum = check

19、sum( USHORTcmp_data, datasize); / 計算校驗和 /*發送ICMPi青求報文*/bwrote = sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr *)&dest, sizeof (dest); / 第五第六處if (bwrote = SOCKET_ERROR if (WSAGetLastError() =WSAETIMEDQUTprintf( Request timed out.n ); continue ; |printf( sendto failed: %dn, WSAGetLastError(

20、); _|return -1;/*接收ICMP應答報文*/bread = recvfrom(sockRaw, recvbuf,MAX PACKET ( struct sockaddr *)&from, &fromlen); /第七處if (bread = SOCKET_ERR)ORif (WSAGetLastError() =WSAETIMEDQUTprintf( Request timed out.n ); continue ; |printf( recvfrom failed: %dn, WSAGetLastError();return -1;/*如果解析成功,遞增成功接收的數目+ */i

21、f (!decode resp(recvbuf, bread, &from) statistic+;Sleep(1000);/間隔1000ms后再發下一個請求報文 /*顯示用戶名和統計結果*/ printf( nPing statistics collected by XXX for %s n, dest ip);printf( Packets: Sent = %d,Received = %d, Lost = %d (%2.0f% loss)n,ICMP_PACKET_NUM B ER發送報文個數 statistic, /接收報文個數 (ICMP PACKET NUMB Statistic),

22、/ 丟失報文個數(float )( ICMP_PACKET_NUMBERatistic) / ICMP_PACKET_NUMB ER0); / 丟包率 /*關閉套接字*/ closesocket(sockRaw); / 第九處 /*注銷函數*/WSACleanup();return 0;/* ICMP回送請求報文填充函數*/void f川_icmp_data(char * icmp_data, int datasize )IcmpHeader *icmp_hdr;char *datapart;icmp_hdr = ( IcmpHeader*) icmp_data ;icmp hdr-i typ

23、e =ICMP ECHOicmp_hdr-i_code = 0;icmp_hdr-i_id = ( USHORGetCurrentProcessId();icmp_hdr-i_cksum = 0;icmp_hdr-i_seq = 0;datapart =icmp data + sizeof (IcmpHeader);memset(datapart, E , datasize - sizeof (IcmpHeader);/* ICMP回送應答報文解析函數*/int decode resp( char * buf, int bytes , structsockaddr in * from)|IpHeader *iphdr;IcmpHeader *icmphdr;unsigned short iphdrlen;iphdr = ( IpHeader *) buf;iphdrlen = (iphdr-h_len) * 4;if ( bytes sin addr);return -1;icmphdr = ( IcmpHeader*)( buf + iphdrlen);if (icmphdr-i_type !=ICMP_ECH

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論