计算机网络实验之Ping程序的设计与实现
计算机网络实验报告(Ping命令)

〖实验项目名称〗:计算机网络基础〖实验目的〗:1、熟悉网卡、掌握如何在Windows下如何察看网卡的型号、MAC地址、IP地址等参数。
2、熟悉Windows中的网络组建及各参数的设置和基本意义。
3、网络测试命令PING的用法。
〖实验任务与要求〗:1、网卡是网络中不可缺少的网络设备,掌握其使用情况,及如何设置其参数对网络的正常使用非常重要。
本部分要完成以下任务:(1)利用Windows下ipconfig 命令查看网卡的基本参数。
(2)如何设置网卡的IP地址。
2、Ping是个使用频率极高的实用程序,用于确定本地主机是否能与另一台主机交换(发送与接收)数据报。
根据返回的信息,就可以推断TCP/IP参数是否设置得正确以及运行是否正常。
(1)Ping 本机IP(Ping 本机机器名;Ping 127.0.0.1)。
(2)Ping 邻近计算机的IP(或者是对方计算机的机器名)。
(3)Ping 网站(前题是能接入Internet)。
〖实验过程〗:(实验步骤、记录、数据、分析)1.Ipconfig的使用(1)、开始-运行,在弹出的对框框中,输入CMD将进入黑白屏幕的DOS界面。
(2)、在“命令提示符”下输入ipconfig/all查看本机网卡的基本参数。
(2)利用“网上邻居”修改网络参数。
(3)PING命令的使用ping 127.0.0.1ping 本机IPping localhostping 局域网内其他IP PING命令参数:-n:发送count指定的ECHO数据包数,通过这个命令可以自己定义发送的个数,对衡量网络速度很有帮助。
能够测试发送数据包的返回平均时间,及时间的快慢程度。
默认值为 4。
-r:在“记录路由”字段中记录传出和返回数据包的路由。
通常情况下,发送的数据包是通过一系列路由才到达目标地址的,通过此参数可以设定,想探测经过路由的个数。
限定能跟踪到9个路由。
一般情况下,通过ping目标地址,可让对方返回TTL值的大小,通过TTL值可以粗略判断目标主机的系统类型是Windows还是UNIX/Linux,一般情况下Windows系统返回的TTL值在100-130之间,而UNIX/Linux系统返回的TTL值在240-255之间。
计算机网络实验PING命令的使用

计算机网络实验PING命令的使用
实验一Windows 操作系统的TCP/IP配置及部分网络命令的使用
一、实验目的
1.熟悉使用ping命令工具来进行测试;
2.熟悉使用ipconfig,route命令;
3.掌握如何在Windows系统中TCP/IP协议属性配置。
二、实验环境:安装Windows操作系统的计算机
三、实验原理
Ping命令:网络上的机器都有唯一确定的IP地址,我们给目标IP 地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可用确定目标主机的存在。
Ipconfig作用:该命令显示所有当前的TCP/IP网络配置值。
Route命令作用:主要用来管理本机路由表,可以查看,添加、修改或删除路由表条目。
四、实验步骤
(一)使用Ping工具进行测试
1、用ping命令Ping本机的IP地址
2、用Ping工具测试其他计算机上TCP/IP协议的工作情况(192.168.18.31是同组IP地址)
3、Ping192.168.18.1(外组)
(二)利用Ipconfig工具进行测试
使用ipconfig/all命令得到如下信息。
(三)当前主机的路由表信息
五、试验心得
通过本次实验,我基本了解了TCP/IP配置及部分网络命令的使用,也让我懂得了“实
践出真知”这个道理。
我们要多动手,多提疑问,这样才能更好
地学好计算机网络这门课。
Ping 程序设计原理(2023最新版)

Ping 程序设计原理⒈引言本文档旨在介绍 Ping 程序设计原理,包括其概述、设计原则和实现细节。
Ping 是一种网络工具,用于测试主机之间的网络连通性。
本文将讨论 Ping 的基本原理、实现方法以及使用示例。
⒉概述Ping 是一种基于 ICMP(Internet Control Message Protocol)的网络工具,它通过向目标主机发送 ICMP 回显请求消息(Echo Request)并等待目标主机的 ICMP 回显应答消息(Echo Reply)来测试主机之间的连通性。
⒊设计原则在设计 Ping 程序时,需要考虑以下原则:- 网络层协议:Ping 使用 ICMP 协议进行通信,所以需要对ICMP 协议进行理解和实现。
- 数据包处理:Ping 程序需要构造 ICMP 回显请求消息,并解析目标主机的 ICMP 回显应答消息。
- 超时机制:Ping 程序需要设置合理的超时时间,如果在超时时间内未接收到回显应答,则认为连接超时。
- 循环测试:Ping 程序可以通过循环发送 ICMP 回显请求消息来进行连通性测试。
⒋实现细节⑴ ICMP 协议ICMP 是一种网络层协议,用于在 IP 网络中传递错误消息和操作性消息。
在 Ping 程序中,我们使用 ICMP 协议来进行主机之间的连通性测试。
⑵构造 ICMP 回显请求消息Ping 程序在发送 ICMP 回显请求消息时,需要构造相应的数据包。
构造 ICMP 数据包过程需要设置以下字段:- 类型:设置为 8,表示 ICMP 回显请求消息。
- 代码:通常设为 0。
- 校验和:对 ICMP 数据包进行校验和计算。
- 标识符和序列号:用于识别 ICMP 回显请求消息和回显应答消息之间的对应关系。
- 数据:可以包含任意数据,用于传递给目标主机处理。
⑶解析 ICMP 回显应答消息Ping 程序在接收到目标主机的 ICMP 回显应答消息时,需要解析其内容。
解析 ICMP 数据包时,需要检查以下字段:- 类型:应为 0,表示 ICMP 回显应答消息。
[计算机]ping实验报告
![[计算机]ping实验报告](https://img.taocdn.com/s3/m/4cc39e9f7e21af45b207a879.png)
学生__
学 号:
一、实验室名称:3302
二、实验项目名称:基于 ICMP 协议的 ping 程序
三、实验原理:
ping 程序使用 ICMP 协议实现。首先 Ping 向目标发送一个 ICMP 响应-请求(type=8),当目标主机 得到请求后,返回 ICMP 响应-应答,根据返回信息的不同判断目标主机是否存在。
七、实验结论:
.
八、总结与心得体会:
九、对本实验过程与字:
.
主机 A
向 192.168.3.1 发送响 应-请求包
主机存在
接收到应答 向发送响应-请求包
主机不存在
超时
主机 实际存在
主机 实际不存在
.
四、实验目的:
1)理解 ICMP 协议 2)了解 IP 协议 3)了解 ping 程序的功能
4)
五、实验内容:
六、实验器材(设备、元器件):
PC 机、可利用的程序运行网络环境(可自己搭建,也可直接连接 internet)。
PING实验报告

PING实验报告沈阳工程学院学生实验报告实验室名称:信息工程系软件实验室实验课程名称:计算机网络实验项目名称:icmp协议应用——ping解析班级:姓名:学号:实验日期:2012年04月28日实验台编号:23 指导教师:批阅教师(签字):成绩:篇二:网络编程实验_ping实验报告网络编程-ping程序设计实验指导书一.实验目的(1)熟悉原始套接字编程。
(2)了解网络的结构。
(3)了解网络传输底层协议。
二.实验要求ping程序是用于测试网络连通性的程序。
要求在windows环境下实现基本的ping程序功能.在命令提示符下输入:ping ***.***.***.*** 其中***为目的主机的ip地址,不要求支持域名,对是否带有开关变量也不做要求。
不带开关变量时,要求返回4次响应。
返回信息的格式:reply from ***.***.***.*** 或request timeout (无法ping通的情况)三.实验原理1、ping的工作原理ping 程序是用来探测主机到主机之间是否可通信,如果不能ping 到某台主机,表明不能和这台主机建立连接。
ping 使用的是icmp协议,它发送icmp 回送请求消息给目的主机。
icmp协议规定:目的主机必须返回icmp回送应答消息给源主机。
如果源主机在一定时间内收到应答,则认为主机可达。
icmp协议通过ip协议发送的,ip协议是一种无连接的,不可靠的数据包协议。
因此,保证数据送达的工作应该由其他的模块来完成。
其中一个重要的模块就是icmp(网络控制报文)协议。
当传送ip数据包发生错误--比如主机不可达,路由不可达等等,icmp协议将会把错误信息封包,然后传送回给主机。
给主机一个处理错误的机会,这也就是为什么说建立在ip层以上的协议是可能做到安全的原因。
icmp数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。
而前 16bit 就组成了icmp所要传递的信息。
ping程序设计与实现课程设计

ping程序设计与实现课程设计一、课程目标知识目标:1. 学生能理解ping程序的工作原理,掌握网络诊断的基本方法。
2. 学生能描述IP协议、ICMP协议的基本概念及其在ping程序中的应用。
3. 学生了解计算机网络的通信原理,掌握如何利用ping程序检测网络连通性。
技能目标:1. 学生能运用所学知识,独立编写简单的ping程序。
2. 学生通过实践操作,提高问题分析及解决能力,具备基本的网络诊断技巧。
3. 学生掌握使用编程工具(如:IDE、编译器等)进行代码编写、调试和优化。
情感态度价值观目标:1. 学生培养对计算机网络的兴趣,激发学习编程的热情。
2. 学生在学习过程中,培养团队协作、沟通表达的能力,增强自信心。
3. 学生通过本课程的学习,认识到网络技术在实际应用中的重要性,培养对网络安全的责任感。
分析课程性质、学生特点和教学要求,本课程旨在让学生掌握ping程序的设计与实现,结合实际操作,提高学生的编程能力和网络诊断技巧。
课程目标具体、可衡量,有助于教师进行教学设计和评估。
通过本课程的学习,学生将具备基本的网络编程知识和技能,为今后的学习和工作打下坚实基础。
二、教学内容1. 网络基础知识回顾:IP协议、ICMP协议、网络层通信原理。
2. ping程序工作原理:发送ICMP请求、接收ICMP回复、计算往返时间(RTT)。
3. 编程语言基础:C语言或Python语言的基本语法,重点掌握数据类型、控制结构、函数定义。
4. ping程序设计与实现:- 环境搭建:安装编程工具、配置网络环境。
- 代码编写:根据ping程序工作原理,编写发送和接收ICMP请求的代码。
- 调试与优化:调试代码,处理异常情况,优化程序性能。
5. 实践操作:分组进行实际操作,组内讨论、分析问题,相互协作完成ping 程序编写。
6. 网络诊断技巧:运用ping程序检测网络连通性,分析网络延迟、丢包等问题。
教学内容安排和进度:第一课时:网络基础知识回顾,介绍ping程序工作原理。
(完整word版)计算机网络实验之Ping程序的设计与实现

课程名称计算机网络实验序号实验五实验项目Ping程序的设计与实现2017年03月25 日实验报告要求1、实验报告封面填表说明(每份实验报告必须附上封面)(1)课程名称:要求与实验大纲和实验指导书中的课程名称一致。
(2)实验序号:指该课程的第几个实验。
(3)实验项目:要求与实验大纲和实验指导书中的实验项目一致。
(4)实验地点:填写完成该实验项目所在的实验室名称。
(5)实验学时:要求与实验大纲和实验指导书中完成该实验项目所需学时一致。
(6)实验类型:是指演示性、操作性、验证性、综合性、设计性。
演示性:教师操作,学生观察,验证理论、说明原理和方法。
操作性:学生按要求动手拆装、调试实验装置或上机操作,掌握其基本原理和方法。
验证性:按实验指导书(教材)要求,由学生通过操作验证所学理论,加深对理论、知识的理解,掌握基本实验知识、方法、技能、数据处理等。
综合性:实验内容涉及本课程的综合知识或相关课程的知识,运用多的知识、多种方法,按要求或自拟实验方案进行实验。
主要培养学生综合运用所学知识、实验方法和实验技能,以培养其分析、解决问题的能力。
设计性:给定实验目的、要求和实验条件,学生自己设计实验方案并加以实现的实验。
学生独立完成从查阅资料、拟定实验方案、实验方法和步骤(或系统分析和设计)、选择仪器设备(或自行设计缺制作)进行实验并完成实验全过程,形成实验报告,培养学生自主实验的能力。
(1)批改:全部批改及更正错误。
(2)评分:按百分制评分,不能评分为“优、良、中、差”或“A、B、C”。
(3)签名及批改日期:任课教师必须在每份学生实验报告中签名和写上批改日期。
(4)成绩:填写学生实验成绩表,实验成绩作为考试成绩评定的依据。
(4)评语:任课教师批改学生实验报告时,应给出简明扼要的评语。
二、实验原理与内容1、一种网络诊断工具2、发送ICMP回送请求报文3、接收 ICMP回送应答报文4、 IP报文格式5、WinSock原始套接字的使用方法与API函数W insock原始套接字编程过程中,服务器端/客户端的编程都按照以下步骤:初始化套接字(WSAStartup)创建套接字(socket或WSASocket)向服务器通信(sendto/recvfrom)关闭套接字(closesocket)结束使用套接字(WSACleanup)6、三种WinSock地址结构①用的Winsock地址结构sockaddr ,针对各种通信域的套接字,存储它们的地址4.编写各个函数代码块5.编译,运行实验代码如下:(温馨提醒:意要在.cpp文件的前后添加#include"stdafx.h" (是预编译处理器把stdafx.h文件中的内容加载到程序中来。
ping命令的设计与实现

设计报告课程计算机网络设计名称《ping命令的设计与实现》专业班级计科094 同组人姓名同组人学号实验日期2013-04-10 指导教师成绩2013 年 04 月 10 日设计目的和要求1、实验目的:Ping命令向目的主机发送ICMP ECHO—REQUEST请求并接收目的主机返回的响应报文,用来检验本地主机和远程的主机是否连接。
2.实验要求:利用ICMP数据包,测试主机的连通性,通过课程设计,使学生熟悉ICMP报文结构,使学生对ICMP有更深的理解。
要求:输出参考系统自带ping程序,命令行运行:ping ip二、设计说明设计分析:使用原始套接字可以读写ICMP分组,利用原始套接字发送ICMP回显请求,并接收ICMP 回显应答,通过icmp_send()发送ICMP回显示请求包,icmp_recv()接收ping目的主机的回复,并使用终端信号处理函数SIGINT处理信号,建立两个线程,一个用于发送数据,另一个用于接收响应数据,主程序等待两个线程运行完毕后再进行下一步动作。
最后,主程序讲发送数据和接收的数据进行统计,并将结果打印出来。
系统运行环境:虚拟机:Fedora14(linux操作系统) gcc设计中的重点和难点:ICMP数据包的打包和解包,以及从CRC16校验算法的分析实现输入和输出条件:在linux系统下运行ping 在出现4个响应包后按Ctrl+c键停止发送。
三、系统详细设计《Ping命令的设计与实现》Ping命令向目的主机发送ICMP ECHO—REQUEST请求并接收目的主机返回的响应报文,用来检验本地主机和远程的主机是否连接。
协议格式图1.1中已经对ICMP协议的报文格式进行了说明。
Ping 的客户端方式的类型为8,代码值为0,表示ICMP的回显请求。
类型为0,代码为0是,是ICMP回显应答。
检验和为16为的crc16 的算法。
0 7 8 15 16 31图1.1 ICMP报文的数据格式图1.2所示为ping所使用的类型和代码格式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称计算机网络实验序号实验五实验项目Ping程序的设计与实现2017年03月25 日实验报告要求1、实验报告封面填表说明(每份实验报告必须附上封面)(1)课程名称:要求与实验大纲和实验指导书中的课程名称一致。
(2)实验序号:指该课程的第几个实验。
(3)实验项目:要求与实验大纲和实验指导书中的实验项目一致。
(4)实验地点:填写完成该实验项目所在的实验室名称。
(5)实验学时:要求与实验大纲和实验指导书中完成该实验项目所需学时一致。
(6)实验类型:是指演示性、操作性、验证性、综合性、设计性。
演示性:教师操作,学生观察,验证理论、说明原理和方法。
操作性:学生按要求动手拆装、调试实验装置或上机操作,掌握其基本原理和方法。
验证性:按实验指导书(教材)要求,由学生通过操作验证所学理论,加深对理论、知识的理解,掌握基本实验知识、方法、技能、数据处理等。
综合性:实验内容涉及本课程的综合知识或相关课程的知识,运用多的知识、多种方法,按要求或自拟实验方案进行实验。
主要培养学生综合运用所学知识、实验方法和实验技能,以培养其分析、解决问题的能力。
设计性:给定实验目的、要求和实验条件,学生自己设计实验方案并加以实现的实验。
学生独立完成从查阅资料、拟定实验方案、实验方法和步骤(或系统分析和设计)、选择仪器设备(或自行设计缺制作)进行实验并完成实验全过程,形成实验报告,培养学生自主实验的能力。
(1)批改:全部批改及更正错误。
(2)评分:按百分制评分,不能评分为“优、良、中、差”或“A、B、C”。
(3)签名及批改日期:任课教师必须在每份学生实验报告中签名和写上批改日期。
(4)成绩:填写学生实验成绩表,实验成绩作为考试成绩评定的依据。
(4)评语:任课教师批改学生实验报告时,应给出简明扼要的评语。
二、实验原理与内容1、一种网络诊断工具2、发送ICMP回送请求报文3、接收 ICMP回送应答报文4、 IP报文格式5、WinSock原始套接字的使用方法与API函数W insock原始套接字编程过程中,服务器端/客户端的编程都按照以下步骤:初始化套接字(WSAStartup)创建套接字(socket或WSASocket)向服务器通信(sendto/recvfrom)关闭套接字(closesocket)结束使用套接字(WSACleanup)6、三种WinSock地址结构①用的Winsock地址结构sockaddr ,针对各种通信域的套接字,存储它们的地址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"#include"stdio.h"#define ICMP_ECHO 8 // ICMP ECHO 请求报文类型#define ICMP_ECHOREPLY 0 // ICMP ECHO 响应报文类型#define ICMP_MIN 8 // 最小ICMP报文大小为8 bytes (只有ICMP首部)#define ICMP_PACKET_SIZE 32 //ICMP报文数据大小#define ICMP_PACKET_NUMBER 4 //发送ICMP报文的个数#define MAX_PACKET 1024 // 最大ICMP报文数据长度#define ICMP_TIMEOUT 1000 //ICMP超时时间#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))#define 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_and_flags; // 分片标记和片偏移unsigned char ttl; // 生存时间unsigned char proto; // 报文数据的协议类型unsigned short checksum; // 首部检验和unsigned int sourceIP; // 源IPunsigned int destIP; // 目的IP}IpHeader;/* 定义结构体:ICMP 首部*/typedef struct icmphdr {BYTE i_type; // ICMP报文类型BYTE i_code; // 代码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, struct sockaddr_in *); // ICMP应答报文解析函数int main(int argc, char **argv){WSADATA wsaData; //套接字信息SOCKET sockRaw; //原始套件字char dest_ip[16];//目的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_TIMEOUT; //超时时间USHORT seq_no = 0;//报文序号从0开始递增int 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(argv[1]));/* 初始化函数 */if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){//第一处printf("WSAStartup failed: %d\n", GetLastError());return -1;}/* 创建传输ICMP协议数据的原始套接字 */sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);//第二/* raw-protocol interface */第三处if (sockRaw == INVALID_SOCKET) {printf("WSASocket() failed: %d\n", WSAGetLastError());return -1;}/* 设置套接字的接收超时选项(即设置SO_RCVTIMEO) */if (setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR){printf("failed to set recv timeout: %d\n", WSAGetLastError());return -1;}/* 设置套接字的发送超时选项(即设置SO_SNDTIMEO) */if (setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) == SOCKET_ERROR){printf("failed to set send timeout: %d\n", 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_SIZE + sizeof(IcmpHeader);icmp_data = (char*)xmalloc(MAX_PACKET);if (!icmp_data) {printf("HeapAlloc failed %d\n", GetLastError());return -1;}/* 创建接收缓冲区,分配内存*/recvbuf = (char*)xmalloc(MAX_PACKET);if (!recvbuf) {printf("HeapAlloc failed %d\n", GetLastError());return -1;}/* 填充待发送的ICMP请求报文*/memset(icmp_data, 0, MAX_PACKET);fill_icmp_data(icmp_data, datasize);/* 显示ping提示信息*/printf("\nPinging %s ....\n\n", dest_ip);/* 发送4个ICMP请求报文,并接收应答报文*/for (int i = 0; i<ICMP_PACKET_NUMBER; i++){int bwrote = 0, bread = 0; //实际发送和接收数据大小((IcmpHeader*)icmp_data)->i_cksum = 0; //校验和字段置0((IcmpHeader*)icmp_data)->timestamp = 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, (struct sockaddr*)&dest, sizeof(dest));//第五第六处if (bwrote == SOCKET_ERROR){if (WSAGetLastError() == WSAETIMEDOUT) {printf("Request timed out.\n");continue;}printf("sendto failed: %d\n", WSAGetLastError());return -1;}/* 接收ICMP应答报文*/bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from, &fromlen);//第七处if (bread == SOCKET_ERROR){if (WSAGetLastError() == WSAETIMEDOUT) {printf("Request timed out.\n");continue;}printf("recvfrom failed: %d\n", WSAGetLastError());return -1;}/* 如果解析成功,递增成功接收的数目++ */if (!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_NUMBER, //发送报文个数statistic,//接收报文个数(ICMP_PACKET_NUMBER - statistic),//丢失报文个数(float)(ICMP_PACKET_NUMBER - statistic) / ICMP_PACKET_NUMBER * 100);//丢包率/* 关闭套接字 */closesocket(sockRaw);//第九处/* 注销函数 */WSACleanup();return 0;}/* ICMP回送请求报文填充函数 */void fill_icmp_data(char * icmp_data, int datasize){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 = icmp_data + sizeof(IcmpHeader);memset(datapart, 'E', datasize - sizeof(IcmpHeader));}/* ICMP回送应答报文解析函数 */int decode_resp(char *buf, int bytes, struct sockaddr_in *from){IpHeader *iphdr;IcmpHeader *icmphdr;unsigned short iphdrlen;iphdr = (IpHeader *)buf;iphdrlen = (iphdr->h_len) * 4;if (bytes < iphdrlen + ICMP_MIN) {printf("Too few bytes from %s\n", inet_ntoa(from->sin_addr));return -1;}icmphdr = (IcmpHeader*)(buf + iphdrlen);if (icmphdr->i_type != ICMP_ECHOREPLY) {printf("non-echo type %d recvd\n", icmphdr->i_type);return -1;}if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) {printf("someone else''s packet!\n");return -1;}printf("%d bytes from %s:", bytes- iphdrlen - 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, int size) { unsigned long cksum = 0;while (size >1) {cksum += *buffer++;size -= sizeof(USHORT);}if (size) {cksum += *(UCHAR*)buffer;}cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >> 16);return (USHORT)(~cksum);}#include"stdafx.h"6.按Crtl+F5编译、运行,结果如图所示:。