ping程序的实现

合集下载

用C语言实现Ping程序功能

用C语言实现Ping程序功能

用C语言实现Ping程序功能用C语言实现Ping程序功能部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法。

在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序。

ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。

ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。

例如,在Linux终端上执行ping localhost命令将会看到以下结果:PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=0 ttl=255 time=112 usec64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=255 time=79 usec64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=2 ttl=255 time=78 usec64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=3 ttl=255 time=82 usec--- localhost.localdomain ping statistics ---4 packets transmitted, 4 packets received, 0% packet lossround-trip min/avg/max/mdev = 0.078/0.087/0.112/0.018 ms由上面的执行结果可以看到,ping命令执行后显示出被测试系统主机名和相应IP地址、返回给当前主机的ICMP报文顺序号、ttl生存时间和往返时间rtt(单位是毫秒,即千分之一秒)。

Ping 程序设计原理(2023最新版)

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应用程序实现代码

Ping应用程序实现代码#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<process.h>#include "winsock.h"#pragma comment(lib,"Ws2_32");#define SEND_SIZE 32#define PACKET_SIZE 4096#define ICMP_ECHO 8 #define ICMP_ECHOREPLY 0 struct icmp{unsigned char icmp_type;unsigned char icmp_code;unsigned short icmp_cksum;unsigned short icmp_id;unsigned short icmp_seq;unsigned long icmp_data;};struct ip{unsigned char ip_hl:4;unsigned char ip_v:4;unsigned char ip_tos;unsigned short ip_len;unsigned short ip_id;unsigned short ip_off;unsigned char ip_ttl;unsigned char ip_p;unsigned short ip_sum;unsigned long ip_src;unsigned long ip_dst;};unsigned char sendpacket[PACKET_SIZE]; unsigned charrecvpacket[PACKET_SIZE]; struct sockaddr_in dest_addr; struct sockaddr_in from_addr; int sockfd;int pid;unsigned short cal_chksum(unsigned short *addr,int len);int pack(int pack_no);int unpack(unsigned char *buf,int len); void send_packet(void);void recv_packet(void);void main(){int argc;char *argv[2];argc = 2;argv[0]= "-t";argv[1]="192.168.1.2";struct hostent *host;struct protoent *protocol; WSADATA wsaData;int timeout=1000;int SEND_COUNT=4;int i;char *par_host;par_host=argv[argc-1]; //IP??Öµswitch(argc){case 2: break;case 3: if(strcmp(argv[1],"-t")==0){SEND_COUNT=10000;break;}//fall throughdefault:printf("usage: %s [-t] Host name or IP address\n",argv[0]); exit(1);}if(WSAStartup(0x1010,&wsaData)!=0) {printf("wsastartup error\n");exit(1);}if( (protocol=getprotobyname("icmp") )==NULL){printf("getprotobyname error\n");exit(1);}printf("%s\n",protocol->p_name);printf("%s\n",protocol->p_aliases);printf("%d\n",protocol->p_proto);system("pause");if( (sockfd=socket(AF_INET,SOCK_RAW,protocol->p_proto) )<0){printf("socket error\n");exit(1);}if(setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof (timeout))<0)fprintf(stderr,"failed to set recvtimeout: %d\n",WSAGetLastError());if(setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof (timeout))<0)fprintf(stderr,"failed to set sendtimeout: %d\n",WSAGetLastError());memset(&dest_addr,0,sizeof(dest_addr));dest_addr.sin_family=AF_INET;printf("%s\n",par_host);if(host=gethostbyname(par_host) ){printf("%s\n",par_host);memcpy( (char *)&dest_addr.sin_addr,host->h_addr,host->h_length); //resolve address to hostnameif(host=gethostbyaddr(host->h_addr,4,PF_INET))par_host=host->h_name;printf("%s\n",par_host); }elseif( dest_addr.sin_addr.s_addr=inet_addr(par_host)==INADDR_NONE) {printf("Unkown host %s\n",par_host);exit(1);}pid=getpid();printf("%d\n",pid);system("pause");printf("Pinging %s [%s]: with %d bytes ofdata:\n\n",par_host,inet_ntoa(dest_addr.sin_addr),SEND_SIZE);for(i=0;i<SEND_COUNT;i++){send_packet();recv_packet();Sleep(1000);}}//this algorithm is referenced from other's/*Ð?ÑéËã??*/unsigned short cal_chksum(unsigned short *addr,int len) {int nleft=len;int sum=0;unsigned short *w=addr;unsigned short answer=0;while(nleft>1){ sum+=*w++;nleft-=2;}if( nleft==1){ *(unsigned char *)(&answer)=*(unsigned char *)w;sum+=answer;}sum=(sum>>16)+(sum&0xffff);sum+=(sum>>16);answer=~sum;return answer;}//?ò?üint pack(int pack_no){int packsize;struct icmp *icmp;packsize=8+SEND_SIZE;icmp=(struct icmp*)sendpacket;icmp->icmp_type=ICMP_ECHO;icmp->icmp_code=0;icmp->icmp_cksum=0;icmp->icmp_seq=pack_no;icmp->icmp_id=pid;icmp->icmp_data=GetTickCount();icmp->icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*Ð?ÑéËã??*/return packsize;}//?â?üint unpack(unsigned char *buf,int len) {struct ip *ip;struct icmp *icmp;double rtt;int iphdrlen;ip=(struct ip *)buf;iphdrlen=ip->ip_hl*4;icmp=(struct icmp *)(buf+iphdrlen);if( (icmp->icmp_type==ICMP_ECHOREPLY) && (icmp->icmp_id==pid) ) {len=len-iphdrlen-8;rtt=GetTickCount()-icmp->icmp_data;printf("Reply from %s: bytes=%d time=%.0fms TTL=%dicmp_seq=%u\n",inet_ntoa(from_addr.sin_addr),len,rtt,ip->ip_ttl,icmp->icmp_seq);return 1;}return 0;}//??ËÍvoid send_packet(){int packetsize;static int pack_no=0;packetsize=pack(pack_no++);if( sendto(sockfd,(char *)sendpacket,packetsize,0,(structsockaddr *)&dest_addr,sizeof(dest_addr) )<0 ) printf("Destination host unreachable.\n");printf("send NO %d\n",pack_no-1); }//?ÓÊÕvoid recv_packet(){int n,fromlen;int success;fromlen=sizeof(from_addr); do{if( (n=recvfrom(sockfd,(char*)recvpacket,sizeof(recvpacket),0,(struct sockaddr *)&from_addr,&fromlen)) >=0)success=unpack(recvpacket,n);else if (WSAGetLastError() == WSAETIMEDOUT){printf("Request timed out.\n");return;}}while(!success);}。

socket实现ping命令的原理

socket实现ping命令的原理

socket实现ping命令的原理简介在计算机网络中,pi n g命令是一种用于测试两台主机之间网络连接性的常用工具。

本文将介绍使用so ck et编程实现p in g命令的原理。

什么是sock et?在网络通信中,s ock e t是一种通信机制,它可以使得不同计算机上的程序能够进行数据交换。

通过使用so ck et,我们可以实现不同计算机之间的网络连接和数据传输。

pin g命令的作用p i ng命令用于测试两台主机之间的网络连接性以及网络延迟。

它发送一条IC MP(I nt er ne t Co nt ro lM es sa geP r ot oc ol)回显请求消息到目标主机,并等待该主机返回回显应答消息。

通过这种方式,我们可以确定目标主机是否可达以及网络延迟的情况。

使用socke t编程实现pin g命令使用so ck et编程实现p in g命令需要以下几个步骤:步骤一:创建s o c k et首先,我们需要创建一个so ck et,用于与目标主机建立网络连接。

i m po rt so ck et创建一个IPv4的UDP socketc l ie nt_s oc ke t=soc k et.s oc ke t(so cke t.A F_IN ET,s oc ket.SO CK_ D G RA M)步骤二:设置超时时间为了避免长时间等待应答,我们可以设置一个超时时间。

当发送p in g请求后,如果在超时时间内未收到应答,我们可以认为网络连接存在问题。

设置超时时间为1秒钟c l ie nt_s oc ke t.set t im eo ut(1)步骤三:发送p i n g请求使用so ck et发送pi n g请求需要构建一个I CM P回显请求消息,并发送给目标主机。

i m po rt st ru ct构建ICMP回显请求消息ICMP回显请求ICMP Code为0填充校验和为0标识符(任意数值)序列号(任意数值)构建ICMP消息,计算校验和i c mp_h ea de r=st ruc t.p ac k('!BB HH H',i cm p_ty pe,i cm p_c o de,i cm p_c he ck su m,ic mp_i de nt if ie r,ic mp_s eq ue nc e)计算校验和更新校验和发送ping请求c l ie nt_s oc ke t.send to(i cm p_he ad er,(de st in at io n_ip,0))步骤四:接收应答接下来,我们需要等待目标主机的回应,并对回应消息进行解析。

python实现ping命令小程序

python实现ping命令小程序

python实现ping命令⼩程序ping的原理是发送⼀个ICMP请求包,然后根据⽬的地址的应答包来判断是否能够和这个主机进⾏通信。

我们使⽤python实现,借助于scapy来进⾏编写程序。

from scapy.all import *import time,struct,random# 编写ping⼀个包的函数。

def ping_one(dst = '36.152.44.95',ttl_no = 64,id_no = 345,seq_no = 5):start_time = time.time()# 将时间转换为⼆进制序列。

time_to_bytes = struct.pack('>d',start_time)# 进⾏发送ICMP包,发送出去⼀个,收回来⼀个。

ping_one_result = sr1(IP(dst = dst,ttl = ttl_no)/ICMP(seq = seq_no,id = id_no)/time_to_bytes, timeout = 1, verbose=False)# print(ping_one_result.show())# 判断收回来的包是不是ICMP的应答包,和序列号是否相同。

try:if ping_one_result.getlayer('ICMP').type == 0 and ping_one_result.getlayer('ICMP').seq == seq_no:# print('进⾏解析包')# 提取IP头部中的源IP地址,也就是我们ping的IP地址。

reply_src_IP = ping_one_result.getlayer('IP').src# 提取序列号。

reply_icmp_seq = ping_one_result.getlayer('ICMP').seq# 提取ttlreply_icmp_ttl = ping_one_result.getlayer('IP').ttl# 数据长度等于数据长度(Raw) + 垫⽚长度(Padding) + 8字节(ICMP头部长度)if ping_one_result.getlayer(Raw) != None:Raw_length = len(ping_one_result.getlayer(Raw).load)else:Raw_length = 0if ping_one_result.getlayer(Padding) != None:Padding_length = len(ping_one_result.getlayer(Padding).load)else:Padding_length = 0# 计算数据长度。

计算机网络基础课程设计Ping程序实现

计算机网络基础课程设计Ping程序实现

计算机网络基础课程设计Ping程序实现计算机网络工程课程设计报告题目:Ping程序的实现学生姓名:学号:专业班级:计科专业班同组姓名: 指导教师:设计时间:2022年下学期第某周指导老师意见:评定成绩:签名:日期:年月日目录一、课程设计的目的和意义2二、课程设计的内容和要求21.内容:22.要求:2三、课程设计的相关技术2四、课程设计过程21.Ping主模块22.功能控制模块43.数据报解析模块5五、课程设计小结6六、参考文献7七、附录(程序清单)7八、心得体会11一、课程设计的目的和意义利用ICMP数据包、C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试—个主机到只一个主机之间的连通情况。

通过本程序的训练,使学生熟悉ICMP报文结构,使学生对ICMP有更深的理解,掌握Ping程序的设计方法,掌握网络编程的方法和技巧,从而编写出功能更强大的程序。

二、课程设计的内容和要求1.内容:用C语言实现Ping命令程序,能实现基本的Ping操作,发送ICMP回显请求报文,用于测试—个主机到只一个主机之间的连通情况。

2.要求:1)独立完成程序的设计、编码和调试。

2)系统利用C语言实现,程序调试环境为TurboC或VC;3)按照课程设计规范书写课程设计报告。

4)采用VC环境进行调试运行。

三、课程设计的相关技术由于Ping程序是面向用户的应用程序,该程序使用ICMP的封装机制,通过IP协议来工作。

为了实现直接对IP和ICMP包进行操作,实验中使用RAW模式的ocket编程。

首先定义IP数据报首部,在IP数据报的基础上定义ICMP数据报首部,并初始化一些全局变量。

接着自定义填充ICMP数据报字段函数FillICMPData()、校验和函数checkum()、解读ICMP报首部函数DecodeICMPHeader()、释放资源函Cleanup()。

最后主函数通过调用这些函数来实现Ping命令功能。

ping程序设计与实现课程设计

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程序工作原理。

编程模拟ping程序

编程模拟ping程序

一、实验题目编程模拟ping程序,实现Ping程序的基本功能,即接收到一个ping程序数据包后给出回应。

二、原理概述ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具。

ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者,这有点象潜水艇声纳系统中使用的发声装置。

想要了解ping命令的原理必须了解ICMP协议、ICMP报文格式和IP报文格式。

(1)ICMP报文结构ICMP 报文结构: ICMP 报文前四个字节为报文头部分,第一个字节为报文类型,第二个字节未用, 第三四个字节为报文的校验和。

从第四个字节开始为长度可变的数据段,该段的内容取决于ICMP 的类型,本文所要使用的请求报文和请求应答报文的数据段中前四个字节是报文的标识符和顺序号。

对于整个ICMP 报文来说其长度最长不能超过64K字节。

ICMP 报文结构如图1 所示。

0 7 8 15 16 31 32 47 48 63 64(2)IP报文结构ICMP 报文和其它位于IP 层的报文一样是作为IP 报文的数据段加上IP 报文头组成IP 数据报发出,其中IP 报文头长度一般为20 个字节。

如图2所示。

三、设计方案根据实验题目查找相关资料,熟悉及理解ping的工作原理,从而进一步设计ping程序的功能图和系统流程图。

准备工作做好后就可上机调试,验证其可行性并查找漏洞,完善ping程序。

(1) ping程序的设计包含了4部分:IP、ICMP的头结构,主函数模块,CMP数据包校验和的计算和使用说明模块。

(2)系统流程图首先在主函数里定义变量同时进行初始化,然后检查参数的正确性,如果参数不正确或者没有输入参数,则显示用户帮助信息(Usage ),并结束程序;如果参数正确,则对指定目的地执行Ping命令,如果Ping通,则显示Ping结果并释放占用资源,如果没有Ping通,则报告错误信息,并释放占用资源。

ping程序的设计与实现

ping程序的设计与实现

ping程序的设计与实现
Ping程序的设计与实现是通过一种单向测量技术来实现的,它可以用来评估网络的性能、访问故障和网络可用性。

Ping程序工作时会首先向目标主机发送一个ICMP(网际控制报文协议)报文,然后等待目标主机的应答。

在实现ping程序的过程中,首先要为发送的ICMP数据报定义一个数据结构,这个数据结构将包含所有必要的信息,如报文类型、报文代码、校验和等。

其次,要实现函数,对这个数据结构进行填充和序列化,以便将ICMP报文发送出去。

实现发送ICMP报文后,就要开始接收应答。

为此,可以利用Socket API来创建一个Raw Socket,以便从网络上接收ICMP报文,并将其解码为数据结构,以便能够识别是哪一条报文的应答。

最后,还需要实现超时,用来处理因网络拥塞或丢包等原因导致的应答报文没有收到的情况。

这可以通过在发送ICMP报文之前先设置一个定时器,当定时器到期时,就可以判断该报文没有收到应答报文而超时。

以上就是ping程序的大致设计与实现方式,整个实现的过程可以大体分为发送ICMP数据报、接收应答和超时处理三部分。

这些都需要对数据报结构进行定义和填充,以及使用Socket API创建Raw Socket 来发送和接收数据,并通过设置定时器来实现超时处理,以保证ping 程序可以正常工作。

Linux网络编程基础(4)--Ping的C代码实现

Linux网络编程基础(4)--Ping的C代码实现

Linux⽹络编程基础(4)--Ping的C代码实现1、背景 在进⾏⽹络编程的时候,通常使⽤的协议有TCP协议,UDP协议。

这些协议在简历套接字之初需要制定套接字的类型,⽐如TCP应当设置为 SOCK_STREAM,UDP对应的套接字应当设置为SOCK_DGRAM。

但是这些套接字并⾮能够提供⽹络所需的全部功能,我们还需要其他的套接字,⽐如原始套接字OCK_RAW。

原始套接字可以提供SOCK_STREAM和SOCK_DGRAM所不及的能⼒。

⽐如:(1)有了原始套接字,进程可以读取ICMPV4、ICMPV6、IGMP等的分组。

正如ping所使⽤的套接字,就是SOCK_RAW类型的。

这样使得使⽤ICMP和IGMP的程完全能够作为⽤户进程处理,⽽⽆需向内核添加代码。

(2)有了原始套接字,进程可以处理内核不处理其协议字段的IPV4数据报。

(3)有了原始套接字,进程使⽤IP_HDRINCL套接字选项定制⾃⼰的IPV4头部。

当然,上述的三个功能,并不是本⽂都要涉及的;只关注第⼀个能⼒,编写代码,实现ping程序。

2、基本使⽤ a.定义原始套接字与定义其他套接字没有形式上的巨⼤差别。

int sockfd; sockfd = socket(AF_INET, SOCK_RAW, protocol); protocol 的值是型为 IPPROTO_XXX的量,这些量定义在<netinet/in.h>中,⽐如ping使⽤的 IPPROTO_ICMP(关于IPV6的实现,再后续补充)。

只有超级⽤户才可以创建SOCK_RAW类型的套接字。

b. 原始套接字并不存在端⼝的概念。

可以在原始套接字上调⽤bind函数,但是这么做并不常见。

bind函数会设置发送数据报的源IP地址,如果没有使⽤ bind函数,那么内核将出发的借⼝地址作为源地址。

c. 同样,⼀般不会使⽤connect函数,connect函数会指定⽬的地址,但是因为原始套接字不存在端⼝概念,所以connect函数并不重要了。

Ping 程序设计原理

Ping 程序设计原理

Ping 程序设计原理Ping 程序设计原理1. 简介Ping(Packet Internet Groper)是一种基于 ICMP 协议的网络诊断工具,用于主机之间的连通性和网络延迟。

Ping 命令通过发送 ICMP ECHO_REQUEST 数据包到目标主机,并等待目标主机返回ICMP ECHO_REPLY 数据包来网络连接状态。

本文将介绍 Ping 程序的设计原理和实现方式。

2. 设计原理Ping 程序的设计原理可以分为两个部分:数据包的发送和接收。

2.1 数据包的发送当用户在终端输入 `ping 目标主机地质` 命令后,Ping 程序需要解析用户输入的目标主机地质,获取目标主机的 IP 地质。

然后,Ping 程序构造一个 ICMP ECHO_REQUEST 数据包,并将其发送到目标主机的 IP 地质。

在构造 ICMP ECHO_REQUEST 数据包时,Ping 程序需要设置相应的字段,包括类型、代码、校验和等。

其中,类型字段用于指定数据包类型为请求报文,代码字段一般设置为 0,校验和字段用于验证数据包完整性。

发送 ICMP ECHO_REQUEST 数据包时,Ping 程序需要调用底层的网络库,将数据包发送到目标主机的 IP 地质。

发送数据包后,Ping 程序等待目标主机返回 ICMP ECHO_REPLY 数据包。

2.2 数据包的接收Ping 程序在发送 ICMP ECHO_REQUEST 数据包后,会进入接收状态,等待目标主机返回 ICMP ECHO_REPLY 数据包。

当 Ping 程序接收到目标主机返回的 ICMP ECHO_REPLY 数据包时,会计算网络延迟,并将结果显示在终端上。

在接收 ICMP ECHO_REPLY 数据包时,Ping 程序需要调用底层的网络库,监听网络接口,等待数据包的到达。

当接收到 ICMP ECHO_REPLY 数据包时,Ping 程序需要校验数据包的完整性,并提取出其中的字段,包括类型、代码、校验和等。

tracert_与_ping_程序设计与实现实验目的_概述说明

tracert_与_ping_程序设计与实现实验目的_概述说明

tracert 与ping 程序设计与实现实验目的概述说明1. 引言1.1 概述:本文旨在详细介绍tracert和ping程序的设计与实现以及相关实验结果分析。

tracert和ping是常用的网络诊断工具,在网络故障排除和性能优化中起着重要作用。

tracert用于跟踪数据包从源主机到目标主机的路由路径,可以帮助定位网络延迟和丢包问题的根源;ping则通过发送ICMP回显请求来测试目标主机的连通性,并计算往返时间(RTT)和丢包率。

1.2 文章结构:本文共分为五个部分。

引言部分对实验内容进行概述,说明文章结构,并明确目的。

第二部分将详细介绍tracert和ping程序的设计与实现过程。

第三部分将对tracert程序的实验结果进行分析,包括路由跟踪过程、延迟和丢包率等方面。

第四部分类似地对ping程序进行结果分析,并比较两者之间的差异及讨论。

最后一部分是结论部分,总结了实验成果并展望了未来研究方向。

1.3 目的:本文旨在通过对tracert和ping程序设计与实现实验结果的详细分析,揭示这些网络诊断工具背后的原理和机制,以及它们在网络故障排除中的作用。

通过本实验可以更好地理解网络通信过程中的延迟和丢包问题,并为进一步优化网络性能提供指导意见。

此外,本文还将展示程序设计和开发的一般方法和技巧,从而对读者在相关领域开展研究提供帮助。

2. 实验设计与实现:2.1 tracert程序设计与实现:在本实验中,我们着重研究和设计了tracert程序的实现。

tracert程序是一个网络工具,用于追踪数据包从源主机到目标主机经过的路由路径。

为了完成tracert 程序的设计和实现,我们需要遵循以下步骤:首先,我们需要使用编程语言(如Python或C++)来编写tracert程序的代码。

这个程序将利用操作系统提供的套接字和ICMP协议来发送和接收网络数据包。

其次,在代码中,我们需要定义一个函数或子程序来处理和解析收到的ICMP 回复数据包。

ping命令的实施步骤

ping命令的实施步骤

ping命令的实施步骤什么是ping命令Ping命令是计算机网络中常用的命令之一,用于测试主机之间的连通性和网络延迟。

通过发送ICMP(Internet控制消息协议)回显请求消息和接收回显应答消息,可以判断主机之间是否连接正常。

本文将介绍ping命令的实施步骤,帮助您更好地了解和使用该命令。

实施步骤以下是使用ping命令测试主机之间连通性和网络延迟的步骤:1.打开命令行界面:在Windows操作系统中,按下Win键+R组合键,然后在运行对话框中输入“cmd”并点击“确定”按钮;在Linux和macOS操作系统中,打开终端应用程序。

2.输入ping命令:在命令行界面中,输入“ping”命令,后面跟上要测试的目标主机的IP地址或域名。

命令的基本格式如下:ping [选项] 目标主机例如,要测试目标主机的IP地址为192.168.0.1:ping 192.168.0.13.等待命令执行:按下回车键后,ping命令将开始执行。

命令会发送ICMP回显请求消息到目标主机,并等待回显应答消息返回。

在等待过程中,您将看到一系列类似以下格式的输出: ``` Pinging 192.168.0.1 with 32 bytes of data: Reply from 192.168.0.1: bytes=32 time=1ms TTL=128 Reply from192.168.0.1: bytes=32 time=2ms TTL=128 Reply from 192.168.0.1: bytes=32time=3ms TTL=128 Reply from 192.168.0.1: bytes=32 time=1ms TTL=128 Ping statistics for 192.168.0.1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 1ms,Maximum = 3ms, Average = 1ms ```4.分析ping结果:ping命令执行完毕后,您可以根据输出的结果来判断主机之间的连通性和网络延迟。

ping 工作原理

ping 工作原理

ping 工作原理
Ping是一种网络工具,用于测试与另一台计算机的连接速度
和响应时间。

它发送一个ICMP(Internet控制消息协议)回
显请求消息到目标计算机,并等待该计算机返回一个ICMP回
显应答消息。

这个过程称为“ping”,因为它模仿了声音在水中
传播时的回音效果。

Ping工作原理的关键步骤如下:
1. 发送ICMP回显请求消息:Ping程序创建一个ICMP数据包,它包含一个特定格式的请求消息。

该消息包含源和目标IP地址,以及其他必要的参数。

然后,该数据包通过网络发送给目标计算机。

2. 目标计算机响应:目标计算机收到ICMP数据包后,检查是否允许回显请求,并生成一个ICMP回显应答消息。

该消息包含相同的数据,源IP地址和其他必要的参数。

然后,该回应
消息通过网络返回给原始发送者。

3. 原始发送者接收响应:原始发送者接收到目标计算机发回的ICMP回显应答消息,并计算延迟时间。

原始发送者可以使用
这个延迟时间来衡量与目标计算机的连接速度和响应时间。

Ping工具通过发送和接收ICMP消息来测试网络连接的可达性和性能。

它主要用于诊断网络问题、检查网络延迟和丢包率,并验证计算机与其他设备之间的通信是否正常。

Ping工具通
常被广泛应用于网络管理、系统管理以及网络故障排除等领域。

Android中实现ping功能的多种方法详解

Android中实现ping功能的多种方法详解

Android中实现ping功能的多种⽅法详解使⽤java来实现ping功能。

并写⼊⽂件。

为了使⽤java来实现ping的功能,有⼈推荐使⽤java的 Runtime.exec()⽅法来直接调⽤系统的Ping命令,也有⼈完成了纯Java实现Ping的程序,使⽤的是Java的NIO包(native io, ⾼效IO包)。

但是设备检测只是想测试⼀个远程主机是否可⽤。

所以,可以使⽤以下三种⽅式来实现:1. Jdk1.5的InetAddresss⽅式⾃从Java 1.5,包中就实现了ICMP ping的功能。

使⽤时应注意,如果远程服务器设置了防⽕墙或相关的配制,可能会影响到结果。

另外,由于发送ICMP请求需要程序对系统有⼀定的权限,当这个权限⽆法满⾜时, isReachable⽅法将试着连接远程主机的TCP端⼝ 7(Echo)。

代码如下:public static boolean ping(String ipAddress) throws Exception {int timeOut = 3000; // 超时应该在3钞以上boolean status = InetAddress.getByName(ipAddress).isReachable(timeOut); // 当返回值是true时,说明host是可⽤的,false则不可。

return status;}2. 最简单的办法,直接调⽤CMDpublic static void ping1(String ipAddress) throws Exception {String line = null;try {Process pro = Runtime.getRuntime().exec("ping " + ipAddress);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));while ((line = buf.readLine()) != null)System.out.println(line);} catch (Exception ex) {System.out.println(ex.getMessage());}}3.Java调⽤控制台执⾏ping命令具体的思路是这样的:通过程序调⽤类似“ping 127.0.0.1 -n 10 -w 4”的命令,这命令会执⾏ping⼗次,如果通顺则会输出类似“来⾃127.0.0.1的回复:字节=32 时间<1ms TTL=64”的⽂本(具体数字根据实际情况会有变化),其中中⽂是根据环境本地化的,有些机器上的中⽂部分是英⽂,但不论是中英⽂环境,后⾯的“<1ms TTL=62”字样总是固定的,它表明⼀次ping的结果是能通的。

ping程序的设计与实现

ping程序的设计与实现

计算机网络课程设计任务书计算机网络课程设计说明书学院名称: 计算机与信息工程班级名称:学生姓名:学号:题目:基于原始套间字实现简单的ping程序指导教师姓名:起止日期:一、选题背景(标题:四号仿宋加粗,顶格,行间距:24磅,上下间距:段前0。

5行,段后0。

5行)(内容:用小四号仿宋,首行空两格)通过设计Ping程序,理解Ping程序的实现原理,ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接.ping 使用的是ICMP协议,它发送ICMP回送请求消息给目的主机。

ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。

如果源主机在一定时间内收到应答,则认为主机可达。

ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可靠的数据包协议。

因此,保证数据送达的工作应该由其他的模块来完成。

其中一个重要的模块就是ICMP(网络控制报文)协议。

二、方案设计(或概要设计)Ping程序可分为四个模块,分别是:初始化(图1-1)、功能控制(图1-2、图1-3、图1-4、)、ping (图1-5)、main测试(图1-6)。

1。

初始化:2。

功能控制:图1-2图1—3图1-4 3.ping:图1-5 4。

main()函数:图1—6三、详细设计要实现ping程序,需要实现以下步骤:1.初始化//定义IP首部格式typedef struct _IPHeader{u_char VIHL;//版本和首部长度u_char ToS;//服务类型u_short TotalLen;//总长度u_short ID;//标识号u_short Frag_Flags; //片偏移量u_char TTL; //生存时间u_char Protocol; //协议u_short Checksum;//首部校验和struct in_addr SrcIP;//源IP地址struct in_addr DestIP; //目的地址}IPHDR,*PIPHDR;//定义ICMP首部格式typedef struct _ICMPHeader{u_char Type;//类型u_char Code;//代码u_short Checksum; //首部校验和u_short ID; //标识u_short Seq;//序列号char Data;//数据}ICMPHDR,*PICMPHDR;//定义ICMP回应请求typedef struct _ECHOREQUEST{ICMPHDR icmpHdr;DWORD dwTime;char cData[REQ_DATASIZE];}ECHOREQUEST, *PECHOREQUEST;//定义ICMP回应答复typedef struct _ECHOREPLY{IPHDR ipHdr;ECHOREQUEST echoRequest;char cFiller[256];}ECHOREPLY, *PECHOREPLY;2.功能//计算校验和函数u_short checksum(u_short *buffer, int len) //发送回应请求函数int SendEchoRequest(SOCKET s, struct sockaddr_in *lpstToAddr)//接收应答回复并进行解析函数DWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom,u_char *pTTL)3。

Ping 程序设计原理

Ping 程序设计原理

Ping 程序设计原理Ping 程序设计原理一、概述Ping 程序是计算机网络中的一种常见工具,用于测试主机之间的可达性。

它通过向目标主机发送一个ICMP Echo请求,并等待目标主机返回一个ICMP Echo响应来判断目标主机是否能够正常响应。

Ping 程序的设计原理主要包括以下几个方面:ICMP协议、Ping数据包的构造、数据包的发送与接收、计时与统计等。

二、ICMP协议Ping 程序使用的是ICMP(Internet Control Message Protocol)协议。

ICMP是TCP/IP协议族中的一个子协议,用于在IP网络中传递错误、控制和信息性消息。

Ping程序利用ICMP协议中的Echo请求和Echo响应消息来测试主机的可达性。

三、Ping数据包的构造Ping 程序发送的数据包通常是一个ICMP Echo请求数据包。

ICMP Echo请求数据包一般由一个ICMP头和一段Payload数据构成。

ICMP头中包含了一些必要的字段,如类型、代码、校验和等。

Payload部分一般包含具体的Ping数据,Ping程序发送的数据包中一般会包含一个序列号字段和一个时间戳字段。

四、数据包的发送与接收在发送Ping数据包时,Ping程序会使用底层的网络套接字API 向目标主机发送ICMP Echo请求数据包。

发送数据包后,程序会等待一段时间来接收目标主机的响应数据包。

如果接收到了相应的ICMP Echo响应数据包,程序会将接收到的数据包解析出来,并计算网络延迟(Round-Trip Time)和丢包率等统计信息。

五、计时与统计Ping程序中的计时与统计功能通常用来评估网络连接的质量。

程序会记录每个发送的数据包的发送时间戳,并在接收到相应的ICMP Echo响应数据包后,再记录下接收时间戳。

通过计算发送和接收时间戳之间的差值,可以得到网络延迟。

程序还会统计发送和接收的数据包数量,以及丢包率等信息。

PING程序原理及实现

PING程序原理及实现

PING程序原理及实现
一、原理:
Ping命令的工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文一模一样地传回给发送者。

Ping的时候发送的ICMP报文类型为8,系统回复的报文类型为0,报文中包含的数据不变。

在发送的时候,我们可以将现在的系统时间作为ICMP的报文数据发出。

接收到回复报文后,可以读取ICMP 报文的数据得到发送的时间,与现在的时间对比可以得到系统的响应时间。

二、程序具体实现:
1)根据IP报文头结构和ICMP报文头结构定义相应的数据结构,然后用定义的数据结构声明要发送
的数据Send和接受数据Recive,并初始化发送数据Send。

将发送的数据Send的ICMP的类型设置为8。

2)声明一个sockaddr_in类型的变量,将其地址设置为目的地的IP地址。

并声明一个
SOCKET类型的成员变量,用来接收和发送ICMP数据。

3)在窗口初始化函数中设置一个时钟,在该时钟的响应函数中发送和接收数据包,并刷
新显示窗口。

4)在发送函数中调用sendto函数发送数据,然后调用select函数监听该SOCKET。

如果在
指定时间内没有监听到数据,则在窗口显示超时;如果有数据,则调用接收函数,分析接收的数据,从中提取发送时间并与现在的时间做对比,得到相应时间。

ping实验报告

ping实验报告
实验报告
学生姓名
学号:
一、实验室名称:
二、实验项目名称:基于ICMP协议的ping程序
三、实验原理:
ping程序使用ICMP协议实现。首先Ping向目标发送一个ICMP响应-请求(type=8),当目标主机得到请求后,返回ICMP响应-应答,根据返实验目的:
1)理解ICMP协议
2)了解IP协议
3)了解ping程序的功能
五、实验内容:
六、实验器材(设备、元器件):
PC机、可利用的程序运行网络环境(可自己搭建,也可直接连接internet)。
七、实验结论:
通过使用ping程序,向目标主机发送一个icmp请求后,主机得到相应,切根据返回的信息判断了目标主机的存在
八、总结及心得体会:
对ICMP协议与IP协议定义有了进一步的理解认识
且了解了ping程序的功能,且能熟练使用ping程序
九、对本实验过程及方法、手段的改进建议:
报告评分:
指导教师签字:

c++实现ping程序

c++实现ping程序

一、实验目的基于ICMP请求与应答实现ping程序,用来测试网络的可达性。

二、实验要求1、显示ping的字节数(Bytes)2、显示ping的往返时间(Times)3、显示ping的生存时间(TTL)3、网络不可达时显示requested out!三、实验原理Ping命令是用来查看网络上另一个主机系统的网络是否正常的工具。

其原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将报文一模一样地传送给发送者。

其所使用的协议是ICMP,ICMP(网际控制报文协议)的功能很多,ping程序所用的是ICMP请求与应答报文。

具体的实现还是很简单的,首先要考虑IP数据报和ICMP数据报的区别,然后这两种数据报的结构,IP数据报的头部有(版本号,头长度,服务类型,总长度,标识,标志,片偏移,生存时间,上层协议标识,头部校验和,源IP地址,目标IP地址),这里只考虑20字节的头部,然后就是ICMP报文,ICMP的功能不同,他的头部结构也就不同,请求与应答报文的结构:类型(8位),代码(8位),校验和(16位),标识符(16位),进程ID(16位),进程ID(16位),时间(32位),这里的各部分的位数很重要,所需要的生存时间TTL就是从IP数据报头取得的。

四、实验代码#include<iostream>#include <winsock2.h>using namespace std;#pragma comment(lib,"WS2_32")#define DEF_BUF_SIZE 1024#define IP_HEADER_SIZE 20#define ICMP_HEADER_SIZE 12typedef struct _ICMP_HEADER {unsigned char bType; //(8位)类型unsigned char bCode; //(8位)代码unsigned short nCheckSum; //(16位)校验各unsigned short nId; //(16位)进程IDunsigned short nSequence; //(16位)序号unsigned long nTimeStamp; //(32位)时间}ICMP_HEADER, *PICMP_HEADER;struct IPHeader{unsigned char m_byVerHLen; //4位版本+4位首部长度unsigned char m_byTOS; //(8位)服务类型unsigned short m_usTotalLen; //(16位)总长度unsigned short m_usID; //(16位)标识unsigned short m_usFlagFragOffset; //3位标志+13位片偏移unsigned char m_byTTL; //TTLunsigned char m_byProtocol; //协议unsigned short m_usHChecksum; //首部检验和unsigned long m_ulSrcIP; //(32位)源IP地址unsigned long m_ulDestIP; //(32位)目的IP地址};//计算校验和(二进制反码求和)unsigned short checksum(PICMP_HEADER picmp,int length){ //length表示icmp回送请求报文的长度long sum=0;unsigned short *icmp=(unsigned short*)picmp;while(length>1){sum+=*icmp++;sum=(sum&0xffff)+(sum>>16); //与高16位的进位数相加length-=2;}if(length==1){ // 报文长度为奇数,最后剩下一个字节sum+=*(unsigned char*)icmp;}while(sum>>16) //进位数与部分和求和sum=(sum&&0xffff)+(sum>>16);return (unsigned short)~sum; //取反}USHORT GetCheckSum(LPBYTE lpBuff, DWORD dwSize) {DWORD dwCheckSum = 0;USHORT* lpWord = (USHORT*)lpBuff;while(dwSize > 1) {dwCheckSum += *lpWord++;dwSize -= 2;}if(dwSize ==1)dwCheckSum += *((LPBYTE)lpBuff);dwCheckSum = (dwCheckSum >> 16) + (dwCheckSum & 0XFFFF);return (USHORT)(~dwCheckSum);}bool Ping(char* lpDestIP) {sockaddr_in DestSockAddr;DestSockAddr.sin_family = AF_INET;DestSockAddr.sin_addr.S_un.S_addr = inet_addr(lpDestIP);DestSockAddr.sin_port = htons(0);char ICMPPack[ICMP_HEADER_SIZE] = {0};PICMP_HEADER pICMPHeader = (PICMP_HEADER)ICMPPack;pICMPHeader->bType = 8;pICMPHeader->bCode = 0;pICMPHeader->nId = (unsigned short) GetCurrentProcessId();pICMPHeader->nCheckSum = 0;pICMPHeader->nTimeStamp = 0;WORD version = MAKEWORD(2, 2);WSADATA wsaData;if(WSAStartup(version, &wsaData) != 0){printf("WSAStartup error\n");return FALSE;}SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);int nTime = 1000;//设置接收超时时间int ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTime, sizeof(nTime));char szRcvBuff[DEF_BUF_SIZE];sockaddr_in SourceSockAddr;for(int i=0; i <4; i++){pICMPHeader->nCheckSum = 0;pICMPHeader->nSequence = i;pICMPHeader->nTimeStamp = GetTickCount();pICMPHeader->nCheckSum = GetCheckSum((LPBYTE)(ICMPPack), ICMP_HEADER_SIZE);unsigned short x=GetCheckSum((LPBYTE)(ICMPPack), ICMP_HEADER_SIZE);int nRet = sendto(s, ICMPPack, ICMP_HEADER_SIZE, 0, (SOCKADDR*)&DestSockAddr, sizeof(DestSockAddr));if(nRet == SOCKET_ERROR){printf("send error.\n");return FALSE;}int nLen = sizeof(sockaddr_in);if(nRet == SOCKET_ERROR){int nError = WSAGetLastError();printf("Recv Error:%d.\n", nError);return FALSE;}nRet = recvfrom(s, szRcvBuff,DEF_BUF_SIZE,0,(SOCKADDR*)&SourceSockAddr,&nLen);if(nRet == SOCKET_ERROR){cout<<"Request timed out!"<<endl;}else{IPHeader *pIPHeader = (IPHeader*)szRcvBuff;PICMP_HEADER pRcvHeader = (PICMP_HEADER)(szRcvBuff + IP_HEADER_SIZE);int nTime = GetTickCount() - pRcvHeader->nTimeStamp;printf("从目标地址传回: %s bytes=%d time=%dms TTL=%d\n", inet_ntoa(SourceSockAddr.sin_addr), nRet, nTime,pIPHeader->m_byTTL);}Sleep(1000);}closesocket(s);WSACleanup();return TRUE;}void main(){while(1){cout<<"输入IP地址:";char ip[20];cin>>ip;Ping(ip);cout<<endl<<endl;}}五、实验截图1、自己写的ping程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

import .*;//java的网络包
import java.io.*;//java的io包
public class Ping {//定义类Ping
private int timeOut;//定义私有整型变量timeout
private Timer t;//声明一个Timer类的对象t,但未分配内存
public Ping(int timeOut){//构造方法进行初始化
this.timeOut=timeOut;
t=new Timer();//给对象t分配内存。

}
public String pingRang(String from,String to){ //确定ping地址的范围
int [] ipFrom=stringArToIntAr(from.split("\\."));//整形数组变量用来接收起始ip地址
int [] ipTo=stringArToIntAr(to.split("\\."));//接收终止的ip地址
String output="";//定义字符串型变量output用来接收结果
ipTo[3]=ipTo[3]+1;//ipTo 数组里的地址的第四个元素加1
while(!matchIP(ipFrom,ipTo)){//
output+="Pinging:"+printIP(ipFrom);// output变量用来接收printIP (ipFrom)的返回结果
output+="("+ping(printIP(ipFrom))+") Response Time:"+responseTime()+"\n";//再接收ping(printIP(ipFrom))的结果
increaseIPrange(ipFrom,ipFrom.length-1);//调用increaseIPrange(),传入的参数为ipFrom起始地址、ipFrom数组长度-1,即为3
}
return output;
}
private void increaseIPrange(int[] ipFrom,int curBit){//逐渐增加IP 地址的范围,curBit表示ip地址的最后一位
ipFrom[curBit]+=1;//ipFrom[3],即表示最后一位每次加1
if (ipFrom[curBit]>255){ //如果最后一位大于255
ipFrom[curBit]=0; //则重新置为0
if(curBit>0) //如果大于0
increaseIPrange(ipFrom,curBit-1);//则再次调用本方法,将增加位置改为ip地址的第三位
}
}
private boolean matchIP(int[] from,int[] to){//判断起始ip地址和终止ip地址是否在同一个网段中
for(int c=0;c<from.length;c++){
if(from[c]!=to[c]){
return false;
}
}
return true;
}
private String printIP(int[] ip)//将数组形式存放的ip地址转换成一般ip地址格式后打印出来
{
String ipV al="";
for(int c=0;c<ip.length;c++)//循环输出ip数组中的每个元素,同时加符号".",得到ip地址格式的字符串
{
ipV al+=ip[c];//ipV al=ipV al+ip[c]
if(c<ip.length-1)
ipV al+=".";//输出IP地址的格式
}
return ipV al;
}
private int[] stringArToIntAr(String[] ar)//实现字符串数组转换为整形数组输出{
int[]result=new int [ar.length];
for(int a=0;a<ar.length;a++)
{
result[a]=Integer.parseInt(ar[a]);
}
return result;
}
public String ping (String host)//获取主机地址名
{
try{
t.start();//通过t调用Timer类中的start()方法
InetAddress address=InetAddress.getByName(host);//给出主机的名称,决定主机的IP地址
String retV al=pingAddress(address);
t.end();
return retV al;
}
catch(UnknownHostException e)//UnknownHostException - 如果找不到host 的IP地址
{
return"指定主机没有找到";
}
}
public String ping (byte []host)//将给定的ip地址创建成InetAddress 对象
{
try{
t.start();
InetAddress address=InetAddress.getByAddress(host);//给出原始的ip地址,返回一个InetAddress对象
String retV al=pingAddress(address);//调用pingAddress()方法,实现ping功能,并取得返回结果
t.end();
return retV al;//返回结果
}
catch(UnknownHostException e)//指示主机IP 地址无法确定而抛出的异常。

{
return"指定主机没有找到";
}
}
private String pingAddress(InetAddress address){//实现ping命令功能,返回字符串格式的原始IP地址。

try{//可能会抛出异常
if(address.isReachable(timeOut))//调用isReachable()方法,如果测试可以达到address地址
return"连接成功";//则返回连接成功
else
return"连接超时";
}
catch(IOException e){//当发生某种I/O 异常时,捕获此异常。

return"不可达";
}
}
public long responseTime(){//响应时间的长度
return t.duration();//调用Timer类的duration()方法计算响应时间。

}
public static void main(String args[]){//main主函数
Ping pt=new Ping(2000);//设置响应时间的最大时间
System.out.println(pt.pingRang("192.168.1.1","192.168.1.5"));//需要测试的ip地址范围
}
}
//package cd.ch02;
final class Timer//定义一个final类Timer
{
private long start;
private long end;
public void start()//开始时间
{
reset();//调用reset()方法重置start和end
System.gc();//然后运行垃圾回收,释放所占用内存
start=System.currentTimeMillis();//记录开始时间为currentTimeMillis当前时间}
public void end()//结束时间
{
System.gc();
end=System.currentTimeMillis();
}
public long duration()//计算响应时间的方法
{
return(end-start);
}
public void reset()//重置开始和结束时间
{
start=0; end=0;
}
}。

相关文档
最新文档