VC++实现ping探测远程主机是否可达
- 格式:doc
- 大小:232.00 KB
- 文档页数:19
电网调度运行人员考试:电网调度自动化运行值班员考试试题1、多选支路元件参数包括()A、线路电阻B、电抗C、对地导纳D、变压器变比正确答案:A, B, C, D2、单选《电网调度管理条例》规定我国调(江南博哥)度机构分为()级调度机构。
A.三B.四C.五正确答案:C3、单选各PMU应对主站心跳报文进行监视,在()秒内未收悉,PMU应主动断开管理管道。
A、10B、20C、30正确答案:A4、多选在保证密码安全中,我们应采取正确的措施有()A、不用生日做密码B、不要使用少于5位的密码C、不要使用纯数字D、不要将密码设得非常复杂正确答案:A, B, C5、单选一个Excel工作簿中系统默认含有 3个工作表,一个工作表中最多有()列,从A至IV。
A.16B.64C.128D.256正确答案:D6、单选子站设备运行维护人员,应熟悉现场紧急情况的处理方法,如遇危及人身安全、设备安全等紧急情况时,应()。
A.汇报调度后再处理B.通知专业技术人员来处理C.立即处理,事后必须汇报正确答案:C7、单选一般电器设备铭牌上的电压和电流的数值是()。
A.瞬时值B.最大值C.有效值D.平均值正确答案:C8、单选()是电能系统分析中最基本和最重要的计算,是各种电磁暂态和机电暂态分析的基础和出发点。
A.潮流计算B.状态估计C.短路电流计算D.安全分析正确答案:A9、单选UPS电源在下列条件下进行旁路切换,指出其中错误的说法是()。
A、150%负荷过载B、超过额定电压波动范围C、输入交流电源断电D、逆变器故障E、人工切换正确答案:C10、单选下列不属于网络安全的技术是:()A.防火墙B.加密狗C.认证D.防病毒正确答案:B11、单选电力调度自动化系统运行管理部门对有调度关系的发电企业、变电站自动化系统运行维护部门实行()归口管理。
A.行业B.专业技术C.行政正确答案:B12、单选()是指在调频过程中有功约束不满足要求时所做的潮流。
计算机网络实验PING命令的使用PING命令是一个常用的网络工具,用于测试主机之间的连通性和测量网络延迟。
在计算机网络实验中,我们可以使用PING命令来检查网络中的主机是否可达,并评估网络的性能和稳定性。
下面将详细介绍PING 命令的使用。
一、PING命令的基本介绍1.PING的概念和作用PING(Packet InterNet Groper)是一个常用的网络工具,用于检测主机和主机之间是否可达,以及计算网络延迟。
PING命令发送一个探测封包到目标主机,并等待接收到目标主机发送的回应。
2.PING命令的原理PING命令利用了Internet控制报文协议(ICMP)来发送探测封包和接收回应。
当目标主机收到PING封包时,它会发送一个回应封包作为响应。
PING命令通过计算探测封包发送和接收之间的时间差来得到网络延迟。
3.PING命令的格式PING命令的基本格式如下:```ping [参数] 目标主机```其中,参数可以用来控制PING命令的行为,目标主机可以是主机名或IP地址。
二、PING命令的常用参数1.-t(持续发送PING请求)使用-t参数可以让PING命令持续发送PING请求,直到手动停止。
这对于测试网络的稳定性和延迟非常有用。
2.-n(指定要发送的PING请求数量)使用-n参数可以指定要发送的PING请求数量。
默认情况下,PING命令会发送4个请求。
通过增加或减少这个数量,可以更好地评估网络的性能。
3.-l(设置PING请求的数据包大小)使用-l参数可以设置PING请求的数据包大小。
默认情况下,PING命令会发送32字节的数据包。
通过修改数据包大小,可以测试网络的带宽和吞吐量。
4.-w(设置等待PING请求的超时时间)使用-w参数可以设置等待PING请求的超时时间。
默认情况下,PING 命令会等待4秒钟。
通过修改超时时间,可以评估网络的稳定性和响应速度。
三、PING命令的使用示例下面是一些使用PING命令的示例场景。
ping命令详解ping命令是计算机网络中常用的命令之一,用于测试网络连接以及判断网络通信质量。
它通过发送数据包来测量从源主机到目标主机的往返时间,并可以检查数据包是否丢失或延迟。
本文将对ping命令进行详细介绍,包括其原理、用法以及常见问题的排查方法。
一、ping命令的原理在计算机网络中,ping命令利用ICMP(Internet Control Message Protocol,互联网控制消息协议)来发送网络数据包,然后等待目标主机的响应来判断网络的连通性和响应时间。
pong则是相应的包。
通过发送一个ICMP Echo Request包给目标主机,然后等待目标主机返回一个ICMP Echo Reply包,ping命令可以计算往返时间(Round-Trip Time,简称RTT)并统计丢包率。
这些信息可以帮助我们检测网络连接是否正常以及网络速度的快慢。
二、ping命令的用法在Windows系统下,我们可以使用命令提示符(Command Prompt)或者Windows PowerShell来执行ping命令。
在Linux和macOS系统下,则可以使用终端(Terminal)来操作。
下面是ping命令的基本用法:ping [选项] [目标主机]其中,目标主机可以是IP地址或者域名。
常见的选项包括:-c n:指定发送数据包的次数,n是一个正整数;-i n:指定发送数据包的时间间隔,n是一个浮点数,单位是秒;-w n:指定等待目标主机响应的超时时间,n是一个正整数,单位是毫秒;-s n:指定发送数据包的大小,n是一个正整数,单位是字节;-t:持续发送数据包,直到手动停止。
例如,执行ping命令ping 发送数据包并等待响应。
ping命令会显示每个数据包的往返时间以及丢包情况。
通过观察ping命令的输出,我们可以判断网络的连通性和响应速度。
三、常见问题的排查方法1. 目标主机不可达问题当我们执行ping命令时,如果显示“请求超时”或者“目标主机不可达”的错误信息,说明目标主机无法通过网络进行访问。
ping -v -i -s的解读-回复“ping v i s”的解读首先,我们先来了解一下ping命令的基本用法。
Ping是一种计算机网络工具,用于测试两个节点之间是否可以通过IP网络进行通信,并且计算通信的延迟时间。
在命令行中,我们可以使用ping命令来向目标节点发送网络控制消息协议(ICMP)回显请求,来测试网络连接的质量。
在这个题目中,“ping v i s”被视为一个特殊的命令,我们将一步一步地解读其含义和可能的应用场景。
第一步:解读ping命令中的参数在这个命令中,我们可以将"v"、"i"、"s"视为三个不同的参数。
这些参数在不同的操作系统或不同版本的ping命令中,可能会有不同的含义和作用。
v参数:通常表示“verbose”(详细模式)的含义。
在ping命令中,该参数用于显示更多的输出信息,以便用户获得更详细的网络连接状态和统计数据。
例如,可以显示每个ICMP回显请求和回复的序号、时间戳、数据包大小等信息。
i参数:通常表示“interval”(间隔)的含义。
在ping命令中,该参数用于设置发送ICMP回显请求的时间间隔。
通过调整间隔时间,可以模拟不同网络负载下的网络连接状况。
较短的间隔可能会导致网络拥塞,而较长的间隔可能会导致连接断开。
s参数:通常表示“size”(大小)的含义。
在ping命令中,该参数用于设置发送的ICMP回显请求中的数据包大小。
通过调整数据包大小,可以测试网络对不同大小数据包的处理能力。
较小的数据包可能会更快地传输,而较大的数据包可能需要更长的时间传输。
第二步:探索不同参数的应用场景1. “ping v”命令的应用场景:在网络故障排除和调试过程中,通过使用“ping -v”命令可以获得更详细的信息,帮助诊断网络连接问题。
通过显示每个ICMP回显请求和回复的详细信息,可以追踪网络连接中的问题,如丢包、延迟等。
c语言实现ping功能的例子【最新版】目录1.概述2.Ping 功能原理3.C 语言实现 Ping 功能的步骤4.代码示例5.总结正文1.概述Ping 功能是网络诊断工具中非常常用的一个功能,它可以用来测试网络中两台主机之间是否可以正常通信,以及通信的延迟情况。
在众多的编程语言中,C 语言是一种非常适合进行网络编程的语言,其具有高效的性能和底层的控制能力。
本文将介绍如何使用 C 语言实现 Ping 功能。
2.Ping 功能原理Ping 功能的原理是发送一个 ICMP(Internet Control Message Protocol,互联网控制报文协议)数据包到目标主机,然后等待目标主机的响应。
发送的数据包包含一个 ICMP Echo Request 报文,目标主机收到请求后会返回一个 ICMP Echo Reply 报文。
发送方收到响应后,可以根据响应的时间和状态判断两台主机之间的网络通信情况。
3.C 语言实现 Ping 功能的步骤(1)包含必要的头文件:在 C 语言中实现 Ping 功能,需要包含<arpa/inet.h>、<netinet/in.h>、<netinet/ip.h>、<netinet/icmp.h>等头文件。
(2)构造 ICMP 数据包:使用 socket 函数创建一个 ICMP 套接字,然后使用 sendmsg 函数发送 ICMP Echo Request 报文。
(3)接收响应:使用 recvmsg 函数接收目标主机返回的 ICMP Echo Reply 报文。
(4)解析响应:根据接收到的 ICMP Echo Reply 报文中的信息,判断网络通信的状态和延迟情况。
linuxping命令的功能和用法在Linux操作系统中,ping命令是一种常用的网络工具,用于测试主机之间网络连接的状态。
ping可以发送ICMP(Internet Control Message Protocol)回应请求到目标主机,通过接收回应来判断目标主机是否可达,并测量往返时间(Round Trip Time,RTT)。
本文将介绍Linuxping命令的功能和用法。
功能:1. 测试主机可达性:使用ping命令可以快速检测目标主机是否可达。
通过发送ICMP回应请求到目标主机,如果目标主机可以正常回应,则表示它是可达的。
如果目标主机无法回应则表示它是不可达的。
2. 测试网络延迟:ping命令不仅可以测试主机的可达性,还可以测量往返时间(RTT),通过发送回应请求和接收回应来计算时间延迟。
这对于识别网络延迟问题很有帮助,特别是在调试网络故障时。
3. 追踪路由路径:通过在ping命令后面加上-t或者-tr选项,可以追踪从本机到目标主机的路由路径。
ping命令会显示经过的中间路由节点,帮助你分析网络连接的路径。
用法:在终端中输入ping命令,后面跟上目标主机的IP地址或者域名,即可执行ping命令。
下面是ping命令的一些常见参数和用法:1. 基本ping命令:使用ping命令最基本的用法是提供目标主机的IP地址或者域名。
例如:ping 192.168.0.1ping 这将发送ICMP回应请求到指定的目标主机,并显示接收到的回应和相关信息。
2. 指定发送次数:可以使用-c参数指定发送回应请求的次数,默认为4次。
例如:ping -c 10 这将发送10次回应请求到指定的目标主机,并显示每次的延迟时间。
3. 指定时间间隔:可以使用-i参数指定发送回应请求的时间间隔(单位为秒)。
例如:ping -i 1 这将每隔1秒发送一次回应请求到指定的目标主机。
4. 持续ping:可以使用-t参数让ping命令持续发送回应请求,直到手动停止。
ping命令的作用及使用方法通用Ping命令是一种网络诊断工具,用于测试计算机之间的网络连接性。
它通过向目标主机发送网络数据包并计算返回时间来判断目标主机是否可达和网络延迟。
使用ping命令可以完成以下任务:1. 测试主机可达性:Ping命令可以测试目标主机是否在线或是否能够从本地主机到达。
如果目标主机能够返回响应,则表示连接正常。
2.测试网络延迟:通过计算发送数据包到目标主机并接收响应所需的时间,可以测量网络的延迟。
对于游戏玩家和网络管理员来说,这对于判断网络的响应速度非常重要。
3. 检测网络丢包率:Ping命令可以通过观察发送数据包与接收数据包的数量来检测网络是否存在丢包现象。
高丢包率可能表明网络出现问题,需要进一步排查。
4.发现网络问题:通过连续发送数据包并测量延迟和丢包率,可以帮助定位网络问题,如网络拥堵、网络设备故障等。
下面是ping命令的使用方法:1.基本语法2.参数说明-t:连续发送ping命令,直到手动停止。
-a:自动查找目标主机的名称。
-n count:指定要发送的ping数据包数量。
-l size:设置ping数据包的大小。
-f:设置不对发送的数据包进行分段。
-i TTL:设置发送ping数据包的生存时间。
-v TOS:设置发送ping数据包的服务类型。
-r count:设置记录ping命令和目标主机之间通信的路由器数。
-s count:设置ping命令发送数据包时记录的时间戳数。
-j host-list:设置ping命令的源路由选择。
-k host-list:设置ping命令的松散源路由。
target_name:要ping的目标主机名称或IP地址。
3.示例- ping 192.168.0.1:ping指定IP地址的主机。
总结:ping命令广泛应用于网络故障排查和测量网络的可达性和延迟。
这个简单而功能强大的工具可以帮助用户快速定位网络问题,并提供有用的信息来解决网络故障。
ping -v -i -s的解读"ping"是一种常用的网络诊断工具,它可以测试主机之间的连通性,并且测量往返时间(RTT)。
以下是"-v"、"-i"和"-s"选项的解释:1. "-v"选项(详细模式):"-v"是"ping"命令的一个附加选项,用于打开详细模式。
当使用"-v"选项时,控制台上将显示每个发送和接收到的ICMP回显请求的详细信息。
这些信息包括每个请求的序列号、发送时间、到达时间和往返时间(RTT)。
这对于详细的网络故障排除很有用,因为它提供了更多的细节。
2. "-i"选项(发送间隔):"-i"是"ping"命令的一个选项,用于设置ICMP回显请求之间的发送间隔。
默认情况下,发送间隔是尽可能快地连续发送ICMP请求,直到收到响应或超时。
通过使用"-i"选项,可以设置发送间隔,以便根据需求来调整发送频率。
发送间隔的单位是秒。
例如,使用"ping -i 2"将使每个ICMP请求之间的发送间隔为2秒。
这对于控制发送速度很有用,特别是在网络存在问题时。
3. "-s"选项(数据包大小):"-s"是"ping"命令的一个选项,用于设置发送的ICMP回显请求的数据包大小。
默认情况下,发送的数据包大小为56字节(包括ICMP 头部)。
使用"-s"选项可以更改数据包的大小。
数据包大小的单位是字节。
例如,使用"ping -s 100"将使ICMP 请求的数据包大小为100字节。
更大的数据包大小可能会对网络性能产生影响,因为它们将占用更多的带宽和资源。
C语言实现ICMP协议并进行PING测试ICMP(Internet Control Message Protocol)是在TCP/IP协议族中的一个重要协议,用于在IP网络中提供一种错误报告机制。
它能够通过发送控制消息并报告错误情况,以协助网络管理员进行网络故障的诊断。
在C语言中实现ICMP协议和进行PING测试的过程可以分为以下几个步骤:1.创建原始套接字:在C语言中,可以使用socket函数创建原始套接字。
原始套接字允许我们直接发送和接收IP数据包,绕过操作系统的网络协议栈。
2.构建ICMP数据包:ICMP数据包由报头和数据组成。
在C语言中,我们可以通过定义一个结构体来构建ICMP报头。
报头的字段包括类型、代码、校验和等等。
并且,我们还需要构建需要发送的数据。
3.计算校验和:ICMP数据包的校验和字段需要填充正确的值。
通过计算ICMP报头和数据的校验和,可以确保接收方能够正确识别数据包是否损坏。
4.发送ICMP请求:使用sendto函数将构建好的ICMP数据包发送给目标主机。
在发送数据包之前,我们还需要指定目的IP地址,即PING的目标主机。
5.接收ICMP响应:使用recvfrom函数从原始套接字中接收数据包。
接收数据包之后,我们需要解析出其中的ICMP报头,并进行校验和的验证,以确保数据包未受损并且与发送的请求对应。
6.输出PING测试结果:根据接收到的ICMP响应数据包,我们可以获得PING测试的结果。
根据接收到的响应类型和代码,可以判断目标主机是否可以访问。
同时,我们可以计算出PING的往返时间(RTT)等其他信息。
通过以上步骤,我们可以实现对目标主机的PING测试,并输出相应的测试结果。
需要注意的是,实现ICMP协议和进行PING测试需要在具备网络编程知识的基础上进行,涉及到网络协议、数据包格式等知识点。
同时,在实际的应用中,还需要处理各种异常情况和错误处理机制,以确保程序的正确性和稳定性。
基于VC++平台的远程主机操作系统探测技术的应用与开发摘要:介绍了基于VC++平台的远程主机操作系统探测技术的应用,对常见的远程主机操作系统探测技术作了较为详尽的论述,比较了这些技术的特点和不足,最后借鉴和吸取nmap思想,通过理解吸收,采用动态链接库技术对一个破解系统中的远程主机操作系统探测模块的进行开发。
论文关键词:反求工程,逆向,网络安全近年来,远程操作系统探测技术被越来越多的运用于网络安全评估软件的开发,它作为一种网络扫描器的应用技术,需要能够避免错误的探测结果、避免影响(或被影响于)防火墙和入侵检测系统,并且可以允许大范围的网络扫描。
而不管其作为网络安全评估工具或者是网络漏洞扫描器,都需要利用网络通信协议工作的特点来实现获取远程主机操作系统的信息。
本文是通过对基于VC++平台的网络服务口令破解系统开发中所采用的远程操作系统探测技术应用提出自己的想法。
2.探测工具中使用的远程主机操作系统探测技术在很多探测工具中是通过获取标识信息技术来获得某些服务的标识信息,这往往是通过对二进制文件的收集和分析来实现的。
另外还可以通过TCP分段(标准/非标准)的响应分析,这是依靠不同操作系统对特定分段的不同反应来区分的。
比较流行的工具有Fyodor的NMAP和Savage的QueSO, 这些大都使用了来自于这种技术的变种。
还有的工具是使用了ICMP响应分析技术,它通过发送UPD或ICMP 的请求报文,然后分析各种ICMP应答。
Ofir Arkin的X-Probe就是使用的这种技术,在通常情况下,X-Probe工作的比较好,但是在防火墙阻塞某些协议时,结果就不太令人满意了。
3.远程主机操作系统探测原理及扫描方式的比较远程主机操作系统探测可以根据各个操作系统在TCP/IP协议栈实现上的不同特点,采用功能测试方法,通过研究其对各种探测的响应,进而识别远程目标主机运行的操作系统。
根据采集信息的方式,可以分为主动扫描和被动扫描两种方式。
要实现一个ping程序,首先需要了解ping程序的基本工作原理。
ping程序通过向目标主机发送ICMP Echo请求并等待回应来检测网络连接。
以下是使用C语言实现一个简单的ping程序的步骤:1. 包含必要的头文件。
2. 定义一些常量和变量。
3. 编写一个函数,用于发送ICMP Echo请求。
4. 编写一个函数,用于接收ICMP Echo回应。
5. 编写主函数,解析命令行参数,调用上述函数进行ping操作。
以下是一个简单的C语言实现的ping程序示例:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <netinet/ip.h>#include <sys/socket.h>#include <netinet/icmp.h>#include <netdb.h>#define MAX_PACKET_SIZE 65507#define TIMEOUT 5void send_icmp_request(int sockfd, struct sockaddr_in *dest_addr);void receive_icmp_response(int sockfd);int main(int argc, char *argv[]) {if (argc != 2) {printf("Usage: %s <hostname>", argv[0]);return 1;}struct hostent *host = gethostbyname(argv[1]);if (host == NULL) {perror("gethostbyname");return 1;}struct sockaddr_in dest_addr;memset(&dest_addr, 0, sizeof(dest_addr));dest_addr.sin_family = AF_INET;dest_addr.sin_port = htons(80);memcpy(&dest_addr.sin_addr, host->h_addr, host->h_length);int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if (sockfd < 0) {perror("socket");return 1;}setsockopt(sockfd, IPPROTO_IP, IP_TTL, &TIMEOUT, sizeof(TIMEOUT));send_icmp_request(sockfd, &dest_addr);receive_icmp_response(sockfd);close(sockfd);return 0;}void send_icmp_request(int sockfd, struct sockaddr_in *dest_addr) { char packet[MAX_PACKET_SIZE];struct icmphdr *icmp_header = (struct icmphdr *)packet;memset(packet, 0, sizeof(packet));icmp_header->type = ICMP_ECHO;icmp_header->code = 0;icmp_header->checksum = 0;icmp_header->un.echo.id = htons(getpid());icmp_header->un.echo.sequence = htons(1);icmp_header->un.echo.data[0] = 'A';icmp_header->un.echo.data[1] = 'B';icmp_header->un.echo.data[2] = 'C';icmp_header->un.echo.data[3] = 'D';icmp_header->un.echo.data[4] = 'E';icmp_header->un.echo.data[5] = 'F';icmp_header->un.echo.data[6] = 'G';icmp_header->un.echo.data[7] = 'H';icmp_header->un.echo.data[8] = 'I';icmp_header->un.echo.data[9] = 'J';icmp_header->un.echo.data[10] = 'K';icmp_header->un.echo.data[11] = 'L';icmp_header->un.echo.data[12] = 'M';icmp_header->un.echo.data[13] = 'N';icmp_header->un.echo.data[14] = 'O';icmp_header->un.echo.data[15] = 'P';icmp_header->checksum = checksum(packet, sizeof(packet));sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)dest_addr, sizeof(*dest_addr));}void receive_icmp_response(int sockfd) {char buffer[MAX_PACKET_SIZE];struct icmphdr *icmp_header;struct sockaddr_in src_addr;socklen_t src_addr_len = sizeof(src_addr);int recv_len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&src_addr, &src_addr_len);if (recv_len < 0) {perror("recvfrom");return;}icmp_header = (struct icmphdr *)buffer;if (icmp_header->type == ICMP_ECHOREPLY) {printf("Received ICMP echo reply from %s:%d", inet_ntoa(src_addr.sin_addr), ntohs(src_addr.sin_port));printf("Round trip time: %ld ms", (long)((unsigned long)recv_len * 8 / 1000));} else {printf("Received unexpected ICMP message type: %d", icmp_header->type);}}unsigned short checksum(const void *buffer, int length) {unsigned long sum = 0;const unsigned short *shorts = (const unsigned short *)buffer;while (length > 1) {sum += *shorts++;length -= 2;}if (length == 1) {sum += htons(*(unsigned char *)buffer << 8);} else {sum += htons(*(unsigned short *)buffer);}while (sum >> 16) {sum = (sum & 0xFFFF) + (sum >> 16);}return ~sum;}```这个程序首先解析命令行参数,获取目标主机名。
单片机实现ping功能的方法在网络通信中,ping是一种常用的网络测试工具,用于测试主机之间的连通性和响应时间。
在计算机网络中,ping命令通常用于确定主机是否可达以及主机之间的延迟。
在这篇文章中,我们将讨论如何使用单片机实现ping功能。
实现ping功能的关键是要能够发送ICMP(Internet Control Message Protocol)数据包并接收响应。
在单片机中,我们可以通过以下步骤来实现ping功能:1. 配置网络模块,首先,我们需要在单片机中集成一个网络模块,例如以太网模块或Wi-Fi模块。
这个模块将负责发送和接收网络数据包。
2. 编写ICMP协议栈,在单片机中,我们需要编写一个简单的ICMP协议栈,用于构建和解析ICMP数据包。
这个协议栈需要能够构建ping请求数据包并解析ping响应数据包。
3. 发送ping请求,一旦ICMP协议栈准备就绪,我们可以使用它来构建并发送ping请求数据包。
这个数据包将包含ping请求的目标IP地址和序列号。
4. 接收ping响应,一旦ping请求数据包发送出去,我们需要等待并接收ping响应数据包。
当我们收到ping响应数据包时,我们可以从中提取出响应时间和其他有用的信息。
5. 分析和显示结果,最后,我们可以对接收到的ping响应数据包进行分析,并将结果显示在单片机的显示屏或通过串口输出。
总的来说,实现ping功能需要单片机具备网络通信能力,并且需要编写ICMP协议栈来处理ping请求和响应。
通过这种方式,我们可以在单片机上实现ping功能,用于测试网络连通性和延迟。
这对于嵌入式系统和物联网设备来说是非常有用的功能。
linux c ping 的例子-回复题目:使用Linux下的C语言编写一个ping程序摘要:本文将介绍如何使用C语言编写一个在Linux环境下运行的ping程序。
ping程序是一种用于测试网络连接的常见工具,通过向目标主机发送ICMP回显请求(ping请求)并等待回复来判断网络的连通性和延迟。
目录:1. 什么是ping?2. C语言实现ping程序的基本原理3. 程序设计和实现步骤3.1 包头初始化3.2 包头校验和计算3.3 发送和接收ping请求4. 编译和运行5. 结论6. 参考资料1. 什么是ping?ping是一种用于测试网络连接的常用工具。
它通过发送ICMP回显请求(ping请求)到目标主机,并等待目标主机的回复来判断网络的连通性和延迟。
ping程序通常使用语法:ping <目标地址>。
2. C语言实现ping程序的基本原理在C语言中,可以使用socket库来实现网络通信。
ping程序需要封装和解析ICMP协议报文,并使用socket发送和接收消息。
程序主要分为初始化、校验和计算、发送和接收消息等几个步骤。
3. 程序设计和实现步骤3.1 包头初始化首先,我们需要初始化ICMP包头。
ICMP包头包括类型、代码、校验和等字段。
对于ping请求,类型(type)为ICMP_ECHO_REQUEST,代码(code)为0。
其余字段包括标识符(identifier)和序列号(sequence number),用于标识回显请求和回显回复的对应关系。
3.2 包头校验和计算ICMP包头校验和用于校验报文的完整性,确保数据在传输过程中没有被篡改。
校验和字段需要使用一种特定的算法进行计算。
在C语言中,可以使用位运算来实现校验和的计算。
3.3 发送和接收ping请求使用socket库发送和接收ping请求需要以下步骤:- 创建一个RAW socket;- 设置socket选项,使其可以接收所有ICMP报文;- 发送ICMP回显请求,即ping请求,并设置超时时间;- 接收目标主机的回复,即ping回复,并计算延迟时间;- 输出结果,包括目标主机的IP地址、连通性和延迟时间。
1 课程设计目的(1)了解探测远程主机是否可达的方法。
(2)了解windows网络编程的基本步骤。
(3)了解TCP/IP协议及ICMP协议。
(4)掌握ping命令的思想。
(5)掌握Windows Socket API的使用方法。
2 课程设计原理ICMP:互联网控制报文协议,提供一个特殊的报文在互联网的结点之间进行监测和控制,测试目的主机是否可达,与本次课程设计目的一致,因此可模拟ICMP的工作方式来编制程序。
首先通过生成一个ICMP“回应请求”,然后将其定向至打算查询的目标主机,远程主机会拦截这个请求,然后生成一条回应答复消息,再通过网络回传给我们。
若是不能抵达目标主机,则会生成相应的错误消息。
具体步骤如下:1)创建类型为SOCK_RAW的一个套接字,同时设定协议IPPROTO_ICMP。
2)创建并初始化ICMP头。
3)调用sendto将ICMP请求发给远程主机。
4)调用recvfrom以接收ICMP响应。
其流程图如下:开始启动Winsock获取关键参数:目的主机地址创建套接字,协议字段:ICMP设置发送和接收数据最长等待时间timeout填写目的主机信息建立ICMP数据包int i=0发送和接收数据包一次,i++i<4?释放内存,关闭Winsock结束是否3程序源代码及运行结果3.1 源代码#include <winsock2.h>#include <iostream.h>#pragma comment( lib, "ws2_32.lib" )#define ICMP_ECHO 8 //回应请求类型的ICMP消息类型#define ICMP_ECHOREPLY 0 //回应答复型的ICMP消息类型#define ICMP_MIN 8 // ICMP数据报最小长度#define DEF_PACKET_SIZE 32 //默认数据报大小#define DEF_PACKET_NUMBER 4 //发送数据报的个数#define MAX_PACKET 1024 //最大ICMP数据报大小char *Ipdest; //目标主机的IP地址int datasize; //ICMP消息的长度//接收到的ICMP消息数,每收到一条ICMP消息就加1static int icmpcount=0;//IP头(20字节)struct IPHEAD{unsigned int headlength:4; // 4位头长度unsigned int version:4; // 4位版本unsigned char tos; // 8位服务类型unsigned short totallength; // 16位总长unsigned short ip_id; // 16位标识unsigned short frag_and_flags; //3个一位标识加分段偏移 unsigned char ttl; //8位存活时间unsigned char protocal; //8位协议类型unsigned short ip_checksum; //16位头校验和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目标IP地址};// ICMP 头(12字节)struct ICMPHEAD{unsigned char type; //类型(0,8)unsigned char code; //代码(0)unsigned short icmp_checksum; //校验和unsigned short icmp_id; //标识符unsigned short seq; //序号unsigned long timestamp; //时间戳};//Fill_icmp_data函数:用于设置ICMP头部,填充ICMP消息void Fill_icmp_data(char * icmp_data, int datasize){ICMPHEAD *icmphead=NULL;char *datapart=NULL;icmphead = (ICMPHEAD*)icmp_data;icmphead->type = ICMP_ECHO; //ICMP_ECHO=8icmphead->code = 0; //类型为8,代码为0,表示回应请求icmphead->icmp_checksum = 0;icmphead->icmp_id = (unsigned short)GetCurrentProcessId();datapart = icmp_data + sizeof(ICMPHEAD);//具体内容的首地址指针//初始化数据包内容部分for(int i=0;i<(datasize-sizeof(ICMPHEAD));i++,datapart++) *datapart=0;}//DecodeICMPHEAD函数:接受数据时从IP头中获取ICMP消息void DecodeICMPHEAD(char *recvbuf, int bread, sockaddr_in *from) {IPHEAD *iphead=NULL;ICMPHEAD *icmphead=NULL;DWORD tick;unsigned short iphdrlen;iphead = (IPHEAD *)recvbuf;//32位字的个数乘以4即字节个数iphdrlen = (iphead->headlength) * 4 ;//获取操作系统启动至今所经过的时间(ms)tick=GetTickCount();if (bread < (iphdrlen + ICMP_MIN)){cout<<"Too few bytes from: "<<inet_ntoa(from->sin_addr);cout<<endl;}icmphead = (ICMPHEAD*)(recvbuf + iphdrlen); //ICMP消息始于IP 头之后//若ICMP消息类型并非查询,则输出相应信息类型if (icmphead->type != ICMP_ECHOREPLY){cout<<"nonecho type "<<int(icmphead->type)<<" received";cout<<endl;}//确认收到的应答ICMP消息是否是对发送出去的消息的回应//若其表示与当前进程不符,则输出出错信息if (icmphead->icmp_id != (unsigned short)GetCurrentProcessId()) {cout<<"It's someone else's packet!"<<endl;return;}//输出收到信息的内容:主机地址,icmp消息序号,回应时间,存活时间cout<<"Reply from "<<inet_ntoa(from->sin_addr);cout<<" bytes="<<bread-iphdrlen;cout<<" time: "<<GetTickCount()-icmphead->timestamp<<" ms ";cout<<" seq="<<icmphead->seq;cout<<endl;icmpcount++;}//Checksum函数:用于求ICMP首部校验和unsigned short Checksum(unsigned short *buffer, int size){unsigned long cksum=0; //设校验和初值为0while(size >1){cksum+=*buffer++; //求各个16位数字之和size -=sizeof(unsigned short);}if(size){cksum += *(unsigned char*)buffer;}cksum = (cksum >> 16) + (cksum & 0xffff); //高位与低位相加cksum += (cksum >>16); //加上进位return (unsigned short)(~cksum); //取反得到校验和}//Usage函数:表示程序的功能void Usage(char *progname){cout<<"Usage:"<<progname<<" <host>"<<endl;cout<<" host remote machine to Ping"<<endl;cout<<endl;}//ValidateArgs函数:用于给目的地址和数据包大小赋值void ValidateArgs(int argc,char **argv){datasize=DEF_PACKET_SIZE; //数据包大小为DEF_PACKET_SIZE=32if(argc<2){Usage(argv[0]); //只输入一个参数:程序名Ipdest="202.119.81.120"; //默认目的地址为:202.119.81.120 }else if(argc==2)Ipdest=argv[1]; //第二个参数为目的地址}//main函数:进行建立套接字,创建ICMP头,设置超时时间,发送和接受数据等。
int main(int argc,char**argv){WSADATA wsaData;SOCKET sockRaw=INVALID_SOCKET;sockaddr_in dest,from;int destlen=sizeof(dest),fromlen=sizeof(from),bwrote,bread;char *icmp_data=NULL,*recvbuf=NULL;struct hostent *hp=NULL;unsigned short seq=0;//启动winsock失败,输出错误提示信息if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0){cout<<"WSAStartup failed:"<<GetLastError();cout<<endl;return -1;}ValidateArgs(argc,argv);//创建套接字失败,输出错误信息提示sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED);if (sockRaw == INVALID_SOCKET){cout<<"WSASocket() failed:"<<GetLastError();cout<<endl;return -1;}//设定发送数据时最长等待时间timeout=1000msint timeout=1000;bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout));if(bread==SOCKET_ERROR){cout<<"setsockopt(SO_RCVTIMEO)failed:"<<WSAGetLastError();cout<<endl;return -1;}//设定接收数据时最长等待时间timeout=1000mstimeout=1000;bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout));if(bread==SOCKET_ERROR){cout<<"setsockopt(SO_SNDTIMEO) failed:"<<WSAGetLastError();cout<<endl;return -1;}//解析目的地址的名称dest.sin_family=AF_INET;if(dest.sin_addr.s_addr=inet_addr(Ipdest)){//inet_addr将IP地址转换成网络地址if((hp=gethostbyname(Ipdest))!=NULL){//gethostbyname主机信息memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length); //复制内存dest.sin_family=hp->h_addrtype;cout<<"dest.sin_addr="<<inet_ntoa(dest.sin_addr);cout<<endl<<'\n';}else{cout<<"gethostbyname() failed:"<<WSAGetLastError();cout<<endl;return -1;}}//建立一个ICMP数据包datasize+=sizeof(ICMPHEAD);//为要发送的数据申请内存空间,最大值为1024icmp_data=new char[MAX_PACKET];//为要接收的数据申请内存空间,最大值为1024recvbuf=new char[MAX_PACKET];//分配内存失败,输出提示信息if(!icmp_data){cout<<"new char[] failed:"<<WSAGetLastError();cout<<endl;return -1;}//将ICMP信息所在空间清零memset(icmp_data,0,MAX_PACKET);//设置ICMP信息头部Fill_icmp_data(icmp_data,datasize);//发送和接收数据,循环四次for(int i=0;i<4;i++){//ICMP信息封装((ICMPHEAD*)icmp_data)->icmp_checksum=0;((ICMPHEAD*)icmp_data)->timestamp = GetTickCount();((ICMPHEAD*)icmp_data)->seq=seq++;((ICMPHEAD*)icmp_data)->icmp_checksum =Checksum((unsigned short*)icmp_data,datasize);//发送数据bwrote = sendto(sockRaw,icmp_data,datasize,0,(sockaddr*)&dest,destlen);if (bwrote == SOCKET_ERROR){if (WSAGetLastError() == WSAETIMEDOUT){cout<<"Request timed out."<<endl;continue;}else{cout<<"sendto( ) failed:"<<WSAGetLastError();cout<<endl;return -1;}}//显示实际发送的字节数cout<<"Pinging "<<inet_ntoa(dest.sin_addr)<<" with ";cout<<bwrote<<" bytes of data:";cout<<endl;//接收数据bread=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(sockaddr*)&from,&fromlen);if (bread == SOCKET_ERROR){if (WSAGetLastError() == WSAETIMEDOUT){cout<<"Request timed out."<<endl;continue;}cout<<"recvfrom() failed: "<<WSAGetLastError();cout<<endl;return -1;}//打开接收到的数据,从中提取ICMP头信息DecodeICMPHEAD(recvbuf,bread,&from);//等待1s钟Sleep(1000);}//输出发送的数据包数、接收的数据包数和丢失的数据包数cout<<endl;cout<<"Ping statistics for "<<inet_ntoa(dest.sin_addr)<<":"<<endl;cout<<" Packets:sent=4,";cout<<"Received="<<icmpcount;cout<<",Lost="<<DEF_PACKET_NUMBER-icmpcount;cout<<"("<<((float)(DEF_PACKET_NUMBER-icmpcount)/DEF_PACKET_NU MBER)*100;cout<<"%loss)";cout<<endl;//释放资源,关闭winsockif(sockRaw!=INVALID_SOCKET)closesocket(sockRaw);delete[] recvbuf;delete[] icmp_data;WSACleanup();return 0;}3.2 运行结果点击“开始”——“运行”——“cmd”,输入“C:\program1\Debug\zpp.exe+目标主机地址”即可运行程序。