计算机网络实验之Ping程序地设计与实现.pdf

上传人:tbuqq 文档编号:5491764 上传时间:2020-05-23 格式:PDF 页数:13 大小:718.24KB
返回 下载 相关 举报
计算机网络实验之Ping程序地设计与实现.pdf_第1页
第1页 / 共13页
计算机网络实验之Ping程序地设计与实现.pdf_第2页
第2页 / 共13页
计算机网络实验之Ping程序地设计与实现.pdf_第3页
第3页 / 共13页
计算机网络实验之Ping程序地设计与实现.pdf_第4页
第4页 / 共13页
计算机网络实验之Ping程序地设计与实现.pdf_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《计算机网络实验之Ping程序地设计与实现.pdf》由会员分享,可在线阅读,更多相关《计算机网络实验之Ping程序地设计与实现.pdf(13页珍藏版)》请在三一文库上搜索。

1、实用标准文档 文案大全 课程名称计算机网络 实验序号实验五 实验项目 Ping程序的设计与实现 2017年 03 月 25 日 实用标准文档 文案大全 实验报告要求 1、实验报告封面填表说明(每份实验报告必须附上封面) ( 1)课程名称:要求与实验大纲和实验指导书中的课程名称一致。 ( 2)实验序号:指该课程的第几个实验。 ( 3)实验项目:要求与实验大纲和实验指导书中的实验项目一致。 ( 4)实验地点:填写完成该实验项目所在的实验室名称。 ( 5)实验学时:要求与实验大纲和实验指导书中完成该实验项目所需学时一致。 ( 6)实验类型:是指演示性、操作性、验证性、综合性、设计性。 演示性: 教师

2、操作,学生观察,验证理论、说明原理和方法。 操作性 :学生按要求动手拆装、调试实验装置或上机操作,掌握其基本原理和方法。 验证性 :按实验指导书(教材)要求,由学生通过操作验证所学理论,加深对理论、知识的理 解,掌握基本实验知识、方法、技能、数据处理等。 综合性 :实验内容涉及本课程的综合知识或相关课程的知识,运用多的知识、多种方法,按要 求或自拟实验方案进行实验。主要培养学生综合运用所学知识、实验方法和实验技能,以培养其分 析、解决问题的能力。 设计性 :给定实验目的、要求和实验条件,学生自己设计实验方案并加以实现的实验。学生独 立完成从查阅资料、拟定实验方案、实验方法和步骤(或系统分析和设

3、计)、选择仪器设备(或自行 设计缺制作)进行实验并完成实验全过程,形成实验报告,培养学生自主实验的能力。 2、实验报告的格式 软件类实验报告格式公共课实验报告格式硬件类实验报告格式 序 号 要求 序 号 要求 序 号 要求 1 实验目的及要求1 实验目的及要求 1 实验预习 实验目的实验原理及内容(简明扼要, 主要是实验接线图) 2 实验原理与内容2 实验步骤所用仪器设备 3 实验软硬件环境3 操作要点预习思考题 4 实验过程(实验步骤、 记录、数据、分析) 4 实验结果2 实 验 原 始 记 录 (经实验指 导 教 师 签 名 认可) 画出实验所需要的各种记录表格 5 测试 / 调试及实验结

4、果 分析 5 实验问题 3 实验报告 数据处理(数据表格、 计算结果、 误差、 结果表达、曲线图等) 6 实验结论与体会6 小结及讨论结论 讨论 3、教师批改学生实验报告要求 ( 1)批改:全部批改及更正错误。 ( 2)评分:按百分制评分,不能评分为“优、良、中、差”或“A、B、 C” 。 ( 3)签名及批改日期:任课教师必须在每份学生实验报告中签名和写上批改日期。 ( 4)成绩:填写学生实验成绩表,实验成绩作为考试成绩评定的依据。 ( 4)评语:任课教师批改学生实验报告时,应给出简明扼要的评语。 实用标准文档 文案大全 成绩: 教 师 评 语 指导教师签名:批阅日期: 一、实验目的及要求 1

5、. 加深对 ICMP协议的理解 2. 熟悉原始套接字的使用方法 3. 掌握 PING程序的实现流程 二、实验原理与内容 1、一种网络诊断工具 2、发送 ICMP回送请求报文 3、接收 ICMP回送应答报文 4、 IP 报文格式 实用标准文档 文案大全 5、WinSock原始套接字的使用方法与API 函数 Winsock 原始套接字编程过程中,服务器端/ 客户端的编程都按照以下步骤: 初始化套接字 (WSAStartup) 创建套接字 (socket 或 WSASocket) 向服务器通信 (sendto/recvfrom) 关闭套接字 (closesocket) 结束使用套接字 (WSACle

6、anup) 6、三种 WinSock地址结构 用的 Winsock 地址结构 sockaddr ,针对各种通信域的套接字, 存储它们的地址 实用标准文档 文案大全 信息。 专门针对 Internet 通信域的 Winsock 地址结构 sockaddr_in 专用于存储 IP 地址的结构 in_addr 三、实验软硬件环境 运行 Windows XP/ Windows Server 2003/Windows 7操作系统的 PC一台 Visual C+6.0/ Visual Studio 2005/Visual Studio 2010开发环境 四、实验过程(实验步骤、记录、数据、分析) 1. 打

7、开 Visual Studio 2013,建立工程文件 2. 了解需求,进行需求分析: 使用 winsock 原始套接字编写 ping 程序,要求实现如下功能: 可以指定 ping 的目标主机 IP。 每次发送 4 个 ICMP回送请求报文,每个请求报文的数据大小为32 字节,发送超时 和接收超时时间设为1000ms 。 对于发出的每个ICMP回送请求报文,若收到应答报文,显示每个应答报文的数据 大小(byte ) 、 源 IP、 序号、响应时间 (ms); 若发送超时或接收超时, 显示“Request time out. ” 最后,显示用户名和ping 的统计信息。统计信息包括发出的请求报文

8、个数、收到 的应答报文个数、丢包个数、丢包率。 3. 绘制流程框图 实用标准文档 文案大全 4. 编写各个函数代码块 5. 编译,运行 实验代码如下:(温馨提醒:意要在 .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“ 实用标准文档

9、文案大全 #include“stdio.h“ #defineICMP_ECHO 8 / ICMP ECHO 请求报文类型 #defineICMP_ECHOREPLY 0 / ICMP ECHO 响应报文类型 #defineICMP_MIN 8 / 最小 ICMP报文大小为 8 bytes (只有 ICMP首部 ) #defineICMP_PACKET_SIZE 32 /ICMP 报文数据大小 #defineICMP_PACKET_NUMBER 4 / 发送 ICMP报文的个数 #defineMAX_PACKET 1024 / 最大 ICMP报文数据长度 #defineICMP_TIMEOUT

10、1000 /ICMP 超时时间 #definexmalloc (s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s) #definexfree (p) HeapFree (GetProcessHeap(),0,(p) /* 定义结构体: IP 首部 */ typedefstructiphdr unsignedint h_len : 4; / 首部长度 unsignedint version : 4; / IP版本 unsignedchar tos; / 服务类型 unsignedshort total_len; / 报文总长度 unsigneds

11、hort ident; / IP报文标识符 unsignedshort frag_and_flags; / 分片标记和片偏移 unsignedchar ttl; / 生存时间 unsignedchar proto; / 报文数据的协议类型 unsignedshort checksum; / 首部检验和 unsignedint sourceIP; / 源 IP unsignedint destIP; / 目的 IP IpHeader ; /* 定义结构体: ICMP 首部 */ typedefstructicmphdr BYTE i_type; / ICMP报文类型 BYTE i_code; /

12、 代码 USHORT i_cksum; / 报文校验和 USHORT i_id; / ICMP报文标识符 USHORT i_seq; / 报文序号 ULONG timestamp; / 时间戳,不是ICMP报文首部的标准组成部分 IcmpHeader; void fill_icmp_data(char *, int ); / ICMP请求报文填充函数 USHORT checksum( USHORT *, int ); / 校验和计算函数 int decode_resp( char *, int , structsockaddr_in *); / ICMP 应答报文解析函数 int main(

13、intargc, char * argv ) 实用标准文档 文案大全 WSADATA wsaData; / 套接字信息 SOCKET sockRaw; / 原始套件字 char dest_ip16;/ 目的 IP(字符串) unsignedint addr = 0; / 目的 IP(整型) structsockaddr_in dest; / 目的 IP(sockaddr_in结构) structsockaddr_in from; / 源 socket 地址 int fromlen = sizeof (from);/ 源 socket 地址的长度 int datasize; / 报文总长度( =

14、首部大小 +数据大小) /int bwrote, bread; /实际发送和接收数据大小 int timeout = ICMP_TIMEOUT; / 超时时间 USHORT seq_no = 0;/ 报文序号从 0 开始递增 int statistic = 0; / 成功接收报文的个数 char *icmp_data; / 指向发送缓冲区的指针 char *recvbuf; / 指向接收缓冲区的指针 memset(dest_ip, 0, sizeof (dest_ip); if ( argci_cksum = 0; / 校验和字段置0 ( IcmpHeader*)icmp_data)-time

15、stamp = GetTickCount(); / 时间戳字段置为当前系统时间 ( IcmpHeader*)icmp_data)-i_seq = seq_no+; / 序号字段每次递增1 ( IcmpHeader*)icmp_data)-i_cksum = checksum(USHORT*)icmp_data, datasize);/ 计算校验和 /* 发送 ICMP请求报文 */ bwrote = sendto(sockRaw, icmp_data, datasize, 0, (structsockaddr *)/ 实用标准文档 文案大全 第五第六处 if (bwrote = SOCKET_

16、ERROR) if (WSAGetLastError() = WSAETIMEDOUT) printf(“Request timed out.n“); continue ; printf(“sendto failed: %dn“, WSAGetLastError(); return -1; /* 接收 ICMP应答报文 */ bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (structsockaddr *)/ 第七处 if (bread = SOCKET_ERROR) if (WSAGetLastError() = WSAETIMEDOUT

17、) printf(“Request timed out.n“); continue ; printf(“recvfrom failed: %dn“, WSAGetLastError(); return -1; /* 如果解析成功,递增成功接收的数目+ */ if (!decode_resp(recvbuf, bread, Sleep(1000); / 间隔 1000ms后再发下一个请求报文 /* 显示用户名和统计结果*/ printf(“nPing statistics collected by XXX for %s n“, dest_ip); printf(“ Packets: Sent =

18、 %d,Received = %d, Lost = %d (%2.0f% loss)n“, ICMP_PACKET_NUMBER, / 发送报文个数 statistic,/ 接收报文个数 (ICMP_PACKET_NUMBER - statistic),/ 丢失报文个数 (float)( ICMP_PACKET_NUMBER - statistic) / ICMP_PACKET_NUMBER * 100);/ 丢包率 /* 关闭套接字 */ closesocket(sockRaw);/ 第九处 /* 注销函数 */ WSACleanup(); return 0; 实用标准文档 文案大全 /*

19、ICMP 回送请求报文填充函数 */ void fill_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; icmp_hdr-i_seq = 0; datapart = icm

20、p_data + sizeof (IcmpHeader); memset(datapart, E , datasize - sizeof (IcmpHeader); /* ICMP 回送应答报文解析函数 */ int decode_resp( char * buf, intbytes , structsockaddr_in * from ) IpHeader *iphdr; IcmpHeader *icmphdr; unsignedshort iphdrlen; iphdr = (IpHeader *) buf; iphdrlen = (iphdr-h_len) * 4; if ( bytes

21、 sin_addr); return -1; icmphdr = (IcmpHeader*)( buf + iphdrlen); if (icmphdr-i_type != ICMP_ECHOREPLY) printf(“non-echo type %d recvdn“, icmphdr-i_type); return -1; if (icmphdr-i_id != (USHORT)GetCurrentProcessId() printf(“someone elses packet!n“); return -1; printf(“%d bytes from %s:“ , bytes - iph

22、drlen - sizeof ( IcmpHeader), inet_ntoa(from -sin_addr); printf(“ icmp_seq = %d. “, icmphdr-i_seq); printf(“ time: %d ms “, bytes ); printf(“n“ ); return 0; /* 校验和计算函数 */ USHORT checksum( USHORT * buffer , intsize ) 实用标准文档 文案大全 unsignedlong cksum = 0; while ( size 1) cksum += * buffer +; size -= siz

23、eof ( USHORT); if ( size ) cksum += *( UCHAR *) buffer ; cksum = (cksum 16) + (cksum cksum += (cksum 16); return ( USHORT)(cksum); #include“stdafx.h“ 6. 按 Crtl+F5 编译、运行,结果如图所示: 五、测试 / 调试及实验结果分析 实用标准文档 文案大全 实验结果如上所示 六、实验结论与体会 1. 通过本次实验,加深了对WinSock套接字的了解 2. 加深了对 CIMP协议的了解 3. 对 IP 报文格式有了更好的理解 4. 掌握了 Ping 程序的实现流程 5. 所用的软件有些配置没有配置好,导致编译会出错,要善于利用百度解决问题 2017 年 03 月 25 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1