-
2021-05-21 17:52:40
Ping命令详解
一、Ping命令概述
Ping命令是网络管理命令中的一种常见命令,基于ICMP协议,用于测试网络的连通性。
通常情况下,直接使用Ping 目的地/目的主机名的格式来发送请求报文测试与目的主机的连通性。
默认情况下发送4个请求报文,目的主机接收到请求报文后,会返回应答报文,否则系统返回超时信息。
二、Ping命令接参数
在网络管理员调试网络时,通常需要持续地向目的主机发送请求报文,以测试网络的连通情况。可以在Ping命令后使用相应的参数。Ping命令的参数及其作用如下(注:为了方便,本文中用*表示目的主机):
(1)ping * -t Ping指定的主机,直到停止。
若要查看统计信息并继续操作,可以使用组合键输入 Contrl+Break;
若要停止,可以使用组合键输入Ctrl+C.
(2)ping * -a 将地址解析成主机名。
(3)ping * -n count 要发送回显请求数。
(4)ping * -l size 发送缓冲区大小。
(5)ping * -f 在数据包中设置"不分段"标志(仅适用于IPv4)。
(6)ping * -i TTL 生存时间。
(7)ping * -v TOS 服务类型(仅适用于IPv4。该设置已不赞成使用,且对IP标头中的服务字段类型没有任何影响)。
(8)ping * -r count 记录计数跃点的路由(仅使用于IPv4)。
(9)ping * -s count 计数跃点的时间戳(仅使用于IPv4)。
(10)ping * -j host-list 与主机列表一起的松散路由(仅使用于IPv4)。
(11)ping * -k host-list 与主机列表一起的严格路由(仅使用于IPv4)。
(12)ping * -w timeout 等待每次回复的超时时间(毫秒)。
(13)ping * -R 同样使用路由标头测试反向路由(仅适用于IPv6)。
(14)ping * -S srcaddr 要使用的源地址。
(15)ping * -4 强制使用IPv4。
(16)ping * -6 强制使用IPv6。
更多相关内容 -
Ping命令实现的扩充
2021-09-27 21:53:02实验内容:Ping命令实现的扩充,在给定的Ping程序的基础上做如下功能扩充: ? -h 显示帮助信息 ? -b 允许ping一个广播地址,只用于IPv4 ? -t 设置ttl值,只用于IPv4 ? -q 安静模式。不显示每个收到的包的分析结果,... -
ping命令 测试主机间网络连通性
2021-01-09 19:36:10ping命令主要用来测试主机之间网络的连通性,也可以用于。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。 不过值得我们注意的是:... -
php模拟ping命令(php exec函数的使用方法)
2020-12-19 09:05:10使用php模拟我们常用的DOS命令ping命令的方法,这里主要用到的是php的内置函数exec来调用系统的ping命令,从而实现ping命令功能的。复制代码 代码如下:<?php$to_ping=’www.phpernote.com’;$count=2;$psize=66;... -
web页面实现ping 命令
2020-02-02 20:10:29在网页上实现ping命令,可以扩展到Tracert命令 在网页上实现ping命令,可以扩展到Tracert命令 -
使用Flutter开发的Ping命令实用程序。-Android开发
2021-05-26 12:02:01使用Flutter开发的Ping命令实用程序。 用Flutter制作的Pinger Ping命令实用程序。 使用的库,工具和服务:(一些)社区软件包:mobx冻结的可注入fl_chart Firebase Firestore应用程序分发Crashlytics Fastlane ... -
python实现ping命令
2018-05-10 17:32:13python实现ping命令。python实现ping命令。python实现ping命令 -
路由器ping不通怎么办故障排除及Ping命令使用注意
2020-10-01 22:31:07路由器ping不通.原因众多...现在简单讲以下几点:使用PING判断TCP/IP故障以及Ping命令的使用注意,感兴趣的朋友可以参考下哈,希望对大家有所帮助 -
ping命令带时间,便于分析网络异常
2020-05-08 11:58:22ping命令带时间.编辑批次档,将8.8.8.8改成自己需要的测试IP地址. 以便于分析网络异常的时间点.还可以编辑批次档,加上>d:\ping.bat .将记录保存起来. -
易语言ping命令源码-易语言
2021-06-12 21:16:50易语言ping命令源码 -
ping命令带时间观察脚本.bat
2020-08-21 11:38:31可以有效保存附带时间的ping记录,方便网络监测和事后故障回顾,是方便从事网络工作者的小工具,批脚本文件,无需修改脚本文件,直接运行,输入需要ping的IP地址或域名即可,Ctrl+C暂停,Y退出,C取消 -
带时间戳ping命令.bat
2020-05-19 15:45:12带时间戳ping命令,方便用户诊断断网的时间是什么时候,有效协作诊断网络问题。运行后生成的文件位于D盘1213.txt 文件 -
C语言:Winsock网络编程—ping命令的简单实现 示例demo
2018-11-24 20:10:54C语言:Winsock网络编程—ping命令的简单实现 示例demo https://blog.csdn.net/qq_29542611/article/details/84452298 -
带端口的PING命令
2018-10-30 12:41:32带TCP端口的PING 命令,属于DOS外部命令,在下载后直接复制到windows\system32下可直接在CMD下使用。 -
mysql 协议的ping命令包及解析详解及实例
2021-01-19 22:40:24mysql 协议的ping命令包及解析详解 前言: MySQL客户端可以用ping命令来检查服务端的状态,正常会返回ok包。 mysql通信报文结构 类型 名字 描述 int payload长度 按照the least significant byte first存储,... -
C++实现ping命令的功能(Windows)
2018-06-23 11:19:29C++实现ping命令的功能(Windows),使用WinSock2.h借助Windows API实现ping命令已经域名解析功能。 -
C++写和ping命令几乎和cmd的ping一样
2018-03-27 14:55:59C++写的,和正常用cmd去ping命令一样的操作,需要可以下载看看 -
java中ping命令ping工具类(循环ping)
2014-05-09 16:00:32java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ... -
增强版ping命令(带时间戳)
2017-04-22 19:18:27一般的ping命令不带时间戳,这个加强版可以形成日志记录。便于网络稳定性长期监控。 -
ping命令
2021-03-24 09:50:49在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为: (1)用来检测网络的连通情况和分析网络速度;(2)根据域名得到服务器IP;(3)根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量...在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为:
(1)用来检测网络的连通情况和分析网络速度;(2)根据域名得到服务器IP;(3)根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。
直接ping IP地址或网关,ping通会显示出以上数据。其中bytes值:数据包大小,字节数;time值:响应时间,这个时间越小,说明连接这个地址速度越快;TTL值:Time To Live,表示DNS记录在DNS服务器上存在的时间,它是IP协议包的一个值,告诉路由器该数据包何时需要被丢弃。可以通过Ping返回的TTL值大小,粗略地判断目标系统类型是Windows系列还是UNIX/Linux系列。默认情况下,Linux系统的TTL值为64或255,WindowsNT/2000/XP系统的TTL值为128,Windows98系统的TTL值为32,UNIX主机的TTL值为255。因此一般TTL值:100~130ms之间,Windows系统;240~255ms之间,UNIX/Linux系统。ping命令除了直接ping网络的ip地址,验证网络畅通和速度之外,它还有这些用法。
1、ping -t的使用
不间断地ping指定计算机,直到管理员中断。按住键盘的Ctrl+c终止它继续ping下去,就会停止了,会总结出运行的数据包有多少,通断的有多少了。
2、ping -a的使用
通过ping它的IP地址,可以解析出主机名(计算机名)。
3、ping -n的使用
在默认情况下,一般都只发送4个数据包,通过这个命令可以自己定义发送的个数,对衡量网络速度都很有帮助,比如我想测试发送10个数据包的返回的平均时间为多少,最快时间为多少,最慢时间为多少。对于一些不好的网络,比如监控系统中非常卡顿,这样测试,返回的结果可能会显示出丢失一部分,如果丢失的额比较多的话,那么就说明网络不好,可以很直观地判断出网络情况。
4、ping -l size的使用
发送size指定大小的数据包到目标主机 在默认的情况下Windows的ping发送的数据包大小为32byte,最大能发送65500byte。当一次发送的数据包大于或等于65500byt时,将可能导致接收方计算机宕机。所以微软限制了这一数值;这个参数配合其它参数以后危害非常强大,比如攻击者可以结合-t参数实施DOS攻击。(所以它具有危险性,不要轻易向别人计算机使用)。
5、ping -r count的使用
在“记录路由”字段中记录传出和返回数据包的路由,探测经过的路由个数,但最多只能跟踪到9个路由。ping -n 1 -r 9 202.102.224.25 (发送一个数据包,最多记录9个路由)
6、批量ping网段
对于一个网段IP地址众多,如果单个检测实在麻烦,那么我们可以直接批量ping网段检测,哪个IP地址出了问题,就会一目了然。直接在命令行窗口输入:for /L %D in (1,1,255) do ping 10.168.1.%D,IP地址段修改成要检查的IP地址段。当输入批量命令后,那么它就自动把网段内所有IP地址都ping完为止。代码中的这个(1,1,255)就是网段起与始,每次逐增1。
-
Delphi可视化单步执行的Ping命令
2021-05-03 03:00:05内容索引:Delphi源码,网络相关,Ping Delphi实现可视化单步执行的Ping命令,在框内输入IP地址,点击“执行Ping”按钮,将执行一次Ping命令,不能连续执行Ping操作,不过大家稍加改进,模拟出像Windows一样的Ping功能... -
linux的ping命令设置时间间隔.docx
2020-08-21 22:41:29第 第 PAGE 1 页 共 NUMPAGES 1 页 linux的ping命令设置时间间隔 Linux下ping命令可以设置每次ping的时间间隔下面由小编为大家整理了linux下ping命令设置时间间隔的相关知识希望对大家有帮助! linux的ping命令设置... -
ping 命令
2019-12-31 15:28:43ping命令是定位网络通不通的一个重要手段。ping是用来探测本机与网络中另一主机之间是否可达的命令,如果两台主机之间ping不通,则表明这两台主机不能建立起连接。 ping 命令是基于 ICMP 协议来工作的,「 ICMP 」...
ping命令是定位网络通不通的一个重要手段。ping是用来探测本机与网络中另一主机之间是否可达的命令,如果两台主机之间ping不通,则表明这两台主机不能建立起连接。ping 命令是基于 ICMP 协议来工作的,「 ICMP 」全称为 Internet 控制报文协议( Internet Control Message Protocol)。ping 命令会发送一份ICMP回显请求报文给目标主机,并等待目标主机返回ICMP回显应答。因为ICMP协议会要求目标主机在收到消息之后,必须返回ICMP应答消息给源主机,如果源主机在一定时间内收到了目标主机的应答,则表明两台主机之间网络是可达的。
开始->cmd->回车进入DOS命令界面 输入ping -? 查看ping 命令的参数,如下图
ping 命令几种常用返回结果
1.Request timed out(请求超时)
可能有以下几种情况
①对方主机不存在或已关机
②对方确实存在、但设置了ICMP数据包过滤
③如何判断对方是否存在:
可以用带参数 -a的ping命令探测对方,如果能得到对方的主机名,则说明对方是存在的,是有防火墙设置,如果得不到,多半是对方不存在或关机,或不在同一网段内。
④ 错误设置IP地址
正常情况下,一台主机应该有一个网卡,一个IP地址,或多个网卡,多个IP地址(这些地址一定要处于不同的IP子网)。但如果一台电脑的“拨号网络适配器”(相当于一块软网卡)的TCP/IP设置中,设置了一个与网卡IP地址处于同一子网的IP地址,这样,在IP层协议看来,这台主机就有两个不同的接口处于同一网段内。当从这台主机Ping其他的机器时,会存在这样的问题:
(a). 主机不知道将数据包发到哪个网络接口,因为有两个网络接口都连接在同一网段。
(b). 主机不知道用哪个地址作为数据包的源地址。
因此,从这台主机去Ping其他机器,IP层协议会无法处理,超时后,Ping 就会给出一个“超时无应答”的错误信息提示。
⑤没有设置网关2.Destination host Unreachable(目标主机不可达)
对方与自己不在同一网段内,而自己又未设置默认的路由。这里要说明一下“destination host unreachable”和 “time out”的区别,如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其他原因不可到达,这时候会出现“time out”,如果路由表中连到达目标的路由都没有,那就会出现“destination host unreachable”。
3.Bad ip address
表示可能没有连接到DNS服务器,所以无法解析这个IP地址,也可能是ip地址不存在
4.Source quench received
表示对方或中途的服务器繁忙无法回应
5.Unknown host
该远程主机的名字不能被域名服务器(DNS)转换成IP地址。故障原因可能是域名服务器有故障,或者其名字不正确,或者网络管理员的系统与远程主机之间的通信线路有故障。
6.No answer
这种故障说明本地系统有一条通向中心主机的路由,但却接收不到它发给该中心主机的任何信息。故障原因可能是下列之一:
① 中心主机没有工作;
② 本地或中心主机网络配置不正确;
③ 本地或中心的路由器没有工作;
④通信线路有故障;
⑤中心主机存在路由选择问题等
为了有效地找出网络故障的原因,在使用Ping命令进行测试检查时,尽量确保局域网中只配置了一个网关,同时确保本机没有启用IP安全设置策略,这样可以保证Ping命令能够正常运行并获得正确的测试结果。
通过思科模拟器进行ping命令测试
(1)首先不设置PC0的网关,进行ping测试,然后再设置上PC0的网关继续测试,结果如下;
(2)不设置PC1的IP地址进行测试;
(3)进行ACL限制
进行测试结果如下;
总结:ping是一个很重要的命令,能帮助我们分析问题,大家务必掌握。如果不记得参数作用 可以通过 ping -?来查看
学以致用,多多实践!
-
android手机之间ping命令的app
2015-04-22 17:24:35有时候大家上网时偶尔会有这样的需求,譬如说查看自己的Ping啊,DNS等等,这款应用就正好可以满足你,输入网址或者IP地址就可以查询Ping、DNS以及WHOIS、HTTP headers、traceroutes等等。 【基本信息】 作者:Ulf ... -
H3C经典Ping命令详解
2015-07-14 22:07:50H3C经典Ping命令详解,简单实用,免费下载 -
Ping命令大全及使用方法
2014-05-18 09:21:41PING的一些参数: ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [[-j computer-list] | [-k computer-list]] [-w timeout] destination-list -t Ping 指定的计算机直到... -
android中的ping命令使用
2021-06-18 11:52:23有时我们需要知道设备的网络好不好,光看手机上的信号格数是不准确的,比如在广州南站,人那么多,如果带宽不够的话,虽然你看着信号是满格的,但是网速也会很慢,所以不能光看信号强度,还是得通过ping命令来看网速...前言
在做Android开发时,有时我们需要知道设备的网络好不好,光看手机上的信号格数是不准确的,比如在广州南站,人那么多,如果带宽不够的话,虽然你看着信号是满格的,但是网速也会很慢,有些地方,人少,信号也满格,但是网速也慢,所以不能光看信号强度,还是得通过ping命令来看网速比较可靠。
在Android的实际开发中,我们公司开发了音视频通讯App,安装在了客户的设备上,客户说,哎,怎么看不到视频啊,你这App不行啊,每次遇到这种问题我们就会说,是你的网络不行啊。啊哈,很搞笑,一有问题我们就会说是客户的网络不好导致的,但是每次你这么说的话也不太好啊,你要拿出证据来啊,客户说他信号明明是满格的呀!所以解决方案就是在App上面增加ping的功能,这样看网络好不好就比较有理有据了。当然,我们也可以远程ping,就是通过网络给客户的app发命令,app收到命令后就开始ping,ping完之后把结果通过网络再传到我们这边的app上,这样我们就可以远程查看客户的网络情况了。
ping的含义
来自百度百科,ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序 。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态。
ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常、网络是否通畅等。
Windows中的ping命令
Windows中的ping命令可以通过 -l 设置发送数据包的大小,通过 -w 可以设置超时时间,示例如下:
如上图,-l 128设置了发送的数据包为128 bytes,不设置的话默认是32 bytes,-w 4000设置了超时时间为4000毫秒(不写的话,默认好像超时也是4000毫秒),Windows默认是ping四次,所以出现了4行的超时(Request timed out.),ping返回结果分析如下:- Pinging 192.168.124.88 with 128 bytes of data: 这说明正在ping 192.168.124.88,数据包大小为128 bytes
- Request timed out. 这说明ping超时了都没有收到192.168.124.88主机的回应。
- Ping statistics for 192.168.124.88: 说明这是ping 192.168.124.88的结果分析。
- Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
- Sent = 4,说明总共发送了4个数据包
- Received = 0,说明所有发出去的数据包中收到回应的个数为0个
- Lost = 4,说明发送的数据包中有4个包丢失了(即没有收到回应)
- 100% loss 说明所有发送的数据包中100%的数据包都丢失了
正常能ping通的效果图如下:
这里可以看到,ping百度的域名,它解析到百度的ip为220.181.38.148,非常的快,发送128 bytes只需要37ms即可收到响应。返回结果分析如下:- Pinging baidu.com[220.181.38.148] with 128 bytes of data: 这说明正在ping baidu.com[220.181.38.148] ,数据包大小为128 bytes
- Reply from 220.181.38.148: bytes=128 time=37ms TTL=50
- Reply from 220.181.38.148: 这说明发送到220.181.38.148的数据包收到回应了
- bytes=128,说明发送的数据包大小为128 bytes
- time=37ms,说明数据包从发送出去到接收到回应,花了37毫秒时间。网络好不好就看这个时间了,像37毫秒就是网络非常好的了,在公司测试发现100毫秒上下也是OK的,数字越小越好,具体数字多大就会卡呢,自己试罢,反正如果你发现卡的时候,就看看这个数字是多少,慢慢的你就知道什么数字是好的,什么数字是差的了。
- TTL=50,TTL(Time To Live,生存周期):每经过一次路由该值自减1,直至减到0时该IP包会被丢弃。通过这样的设置可以在路由遇到死循环时,避免IP包在环内不停转发,但不能达到目的地。 - Approximate round trip times in milli-seconds: 往返行程的估计时间
- Minimum = 37ms, Maximum = 38ms, Average = 37ms
- 最短 = 37ms,即使用时间最短的那个数据包发送接收的使用时间
- 最长 = 38ms,即使用时间最长的那个数据包发送接收的使用时间
- 平均 = 37ms,即所有的数据包平均的发送和接收的使用时间
因为默认只ping四次,所以如果需要一直ping的话可以通过加 -t 参数,示例如下:
这时它就会一直ping,直到我们按Ctrl + C才会停止。关于TTL,一般用默认值就行,为了方便理解,我们修改一下这个参数,使用 -i 可以修改,比如改成5次,然后ping baidu,看经过5次路由能否达到百度,如下:
啊哈,竟然会超时出现,我网络好的很,哎,也不追究这个为什么会出现超时了,反正网上是这么说的:TTL数值每经过一次路由就会减1,如果到0时还没有达到目标主机,就会返回失败了,返回的内容的就是上面的“Reply from 219.158.8.85: TTL expired in transit.”,中文含义为“来自 219.158.8.85的回复:TTL在传输过程中过期了。”Android中的ping命令
在命令行中进入shell:
adb shell
执行效果如下:
这时,我们就可以输入ping命令执行了,如下:
和windows不同,windows默认只ping4次,而linux默认会不停地ping,直到我们按下Ctrl + C才停止。在我的Android项目需求中,不能一直ping,只需要ping一段时间即可,通过 -c 命令可以指定ping的次数,比如设置成只ping4次,如下:
如上图,可以看到,Linux的ping返回结果和Windows的差不多,相同的我就不重复解释了,只说不同点,如下:- PING baidu.com (220.181.38.148) 56(84) bytes of data. 这里的56(84),56指的是数据包的大小为56bytes,84是什么我就不知道了,似乎括号里的这个数值和不带括号的总是相差28。下面一行我们看到有64 bytes,和56 bytes相差8。
- icmp_seq=1 ping序列,从1开始,干嘛用的?我也不知道,在ping的时候你可以通过这个值了解到这是发送的第几个数据包了。
- 4 packets transmitted, 4 received, 0% packet loss, time 3011ms
- 4 packets transmitted,说明传输了4个包
- time 3011ms 这是个什么时间?我也不知道,懒的去查了,开始我以为是整个ping过程所花的总时间,后来打开计时器看发现并不是。 - rtt min/avg/max/mdev = 40.851/53.571/58.797/7.373 ms,rtt是舍意思?我也不知道,懒得查了,后面的,min是最短,avg是平均,max是最长,mdev?,我也不知道,懒得查。这里的最短、平均、最长和Widnows的是一样的含义,不多解释了。
在网络不好时,会发现ping命令一直没有输出内容,如下:
于是就想说,设置个超时时间吧,通过-W可以设置超时时间,这里我设置了超时为1000,我不知道这个1000是个什么单位,是毫秒啊,还是秒?测试发现在我网络不通的时候一直不结束,有可能这个单位是秒,所以超时时间就很长,那我就当它单位是秒吧,设置为10再试一下,发现还是没结果,如下:
那我设置ping的次数为4次,再试一下,如下:
我使用计时器看了一下,大概13秒结束返回结果,搞不懂这个-W设置的超时是个什么原理,跟Windows不一样啊,Windows是每发送一个数据包,如果超时了就会打印一行Request timed out,按照这个逻辑的话上面应该打印4行Request timed out,而且总时间应该是40秒,因为超时是10秒,ping 4次,如果4次都超时则为40秒,这才是正常行为,但是不知道为什么Android上这么奇怪,是因为Android修改过这个Linux底层了吗?带着这个疑问,我打开了我华为云上的Linux主机,发现效果是一样的,如下:
这说明Linux的超时设置就是有问题的!完全没有Windows的那个效果。这里有一篇文章在说为什么Linux ping超时了没有回显消息:https://blog.csdn.net/wj31932/article/details/111315405,文章大长了,我也懒得去慢慢看,这个超时参数不管用那我只能不用它了。那在做Android开发时,如果网络不好ping命令一直不返回也不行啊,怎么结束ping操作啊?,我发现把ping的那个线程中断也不管用。
只输入ping就按回车,可以看到ping命令的所有参数,如下:
如上图,有一个参数为:-w deadline,注,这是小写的w,deadline中文含义为“最后期限”,其作用就是设置整个ping过程的时间,这个功能非常符合我的项目需求,我就是想要设置ping多久,比如我想设置ping30秒,我不管你30秒ping了多少次,我也不管你超时时间是多少,我也不管你网络好不好,反正30秒之后你一定要给我结束,使用如下:
我开计时器了,确实是30秒之后就结束了。总结
ping命令的参数很多,但是真正在用的时候需要的参数也就一两个,所以掌握这一两个就够了。Windows中的ping用-l和-t参数就够了,Linux中的ping用-s和-w就够了,超时时间一般是不用设置的,用默认的就好了。
-
Windows ping简单使用:ping -l 128 -t baidu.com
- l 设置数据包大小为128 bytes
- t 设置一直不停地ping
- 示例如下:
-
Linux ping简单使用:ping -s 120 -w 20 baidu.com
- s 设置数据包大小为120 bytes,实际发送数据包时是128bytes,据说是会包含一些头信息什么的需要额外的8bytes,据我的实验,在Android手机中,默认是1秒ping一次,包含超时时间在里面,比如ping 20秒,不管网络好与不好,20秒后,看统计信息会显示发送的刚好是20个包。
- w设置总的ping时间为20秒
- 示例如下:
-
查看ping参数说明
- Windows直接输入ping即可,如下:
- Linux也是直接输入ping,如下:
如果是在Linux电脑(在Android系统上不行),还可以使用man ping查看ping命令的详细使用手册,如下:
这个手册非常详细,从这里可以看到-w和-W的单位为秒,百度里找到的文章大多数说是毫秒,真是一个个都是转载别人的,一个错个个错,所以,尽量找官网文档看,比较准确。
- Windows直接输入ping即可,如下:
Android中使用代码完成Ping功能
重点:Android使用此函数来执行ping命令:Runtime.getRuntime().exec(“ping -s 56 -w 30 192.168.1.8”),这个函数执行之后会返回一个Process进程对象,通过读取这个进程的两个输入流即可获取到ping的结果,需要注意的是,系统是有可能交替往这两个流里面写入数据的,所以我们需要开两个线程同时读取这两个流(百度的文章里全是一个线程进行读取的),这里使用到了线程的合并功能(join()函数),通过join()函数可以实现让两个线程先执行完,所以这个示例中完美的展示了join()函数的使用,大家可以深刻体会到该函数的作用是怎样的,准确的说,join()函数并不是线程合并函数,而是一个等待函数,比如在A线程里调用了B线程的join()函数,则A线程就等着不动了,等到B线程执行结束了A线程才继续接着往下执行。
先上一个效果图:
这里设置ping的ip为百度的ip,ping 5秒钟,数据包大小为64字节,点击Start Ping按钮,效果如下:
代码如下:
1、首先开启ViewBinding功能,在build.gradle中配置,如下:android { compileSdkVersion 30 buildToolsVersion "30.0.3" buildFeatures { viewBinding true } }
2、界面布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:paddingTop="16dp" android:paddingBottom="16dp" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginLeft="16dp" android:layout_marginRight="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:text="Ping IP: " tools:ignore="SpUsage" /> <EditText android:id="@+id/etIp" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16dp" android:inputType="phone" android:text="39.156.69.79" tools:ignore="Autofill,SpUsage" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginLeft="16dp" android:layout_marginRight="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:text="Ping多久(单位为秒): " tools:ignore="SpUsage" /> <EditText android:id="@+id/etTime" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16dp" android:inputType="number" android:text="5" tools:ignore="Autofill,SpUsage" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginLeft="16dp" android:layout_marginRight="16dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:text="数据包大小(单位为字节): " tools:ignore="SpUsage" /> <EditText android:id="@+id/etSize" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16dp" android:inputType="number" android:text="64" tools:ignore="Autofill,SpUsage" /> </LinearLayout> <Button android:gravity="center" android:id="@+id/btnStartPing" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Start Ping" android:textAllCaps="false" android:textColor="@android:color/white" android:textSize="16dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" tools:ignore="SpUsage" /> </LinearLayout>
3、代码:
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var mAdapter: MyAdapter private val lines = ArrayList<String>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) mAdapter = MyAdapter() binding.recyclerView.layoutManager = LinearLayoutManager(this) binding.recyclerView.adapter = mAdapter binding.btnStartPing.setOnClickListener { thread { ping() } } } private fun ping() { val ip = binding.etIp.text.trim().toString() val sizeStr = binding.etSize.text.trim().toString() val time = binding.etTime.text.trim().toString() if (ip.isBlank()) { runOnUiThread { Toast.makeText(this, "请输入IP", Toast.LENGTH_SHORT).show() } return } if (sizeStr.isBlank()) { runOnUiThread { Toast.makeText(this, "请输入数据包大小", Toast.LENGTH_SHORT).show() } return } if (time.isBlank()) { runOnUiThread { Toast.makeText(this, "请输入要ping多久", Toast.LENGTH_SHORT).show() } return } if (!isValidIpAddress(ip)) { runOnUiThread { AlertDialog.Builder(this) .setTitle("提示") .setMessage("您输入的IP地址格式有误,请修正!") .show() } return } runOnUiThread { binding.btnStartPing.isEnabled = false lines.clear() addData("Ping开始") } val size = sizeStr.toInt() - 8 val command = "ping -s $size -w $time $ip" // 注:正常ping数据和错误ping数据可能会交替输出,所以需要开两个线程同时读取 val process = Runtime.getRuntime().exec(command) val inputStreamThread = readData(process.inputStream) // 读取正常ping数据 val errorStreamThread = readData(process.errorStream) // 读取错误ping数据 // 等待两个读取线程结束 inputStreamThread.join() errorStreamThread.join() runOnUiThread { addData("Ping结束") binding.btnStartPing.isEnabled = true } } private fun readData(inputStream: InputStream?) = thread { try { BufferedReader(InputStreamReader(inputStream)).use { reader -> var line: String? while (reader.readLine().also { line = it } != null) { val lineTemp = line!! runOnUiThread { addData(lineTemp) } // 这里切换到了UI线程,子线程继续执行时可以已经把line对象又赋值为null了,所以使用了lineTemp来预防值被重新赋值 } } } catch (e: Exception) { runOnUiThread { addData("出现异常:${e.javaClass.simpleName}: ${e.message}") } } } private fun addData(data: String) { lines.add(data) refreshListView() } private fun refreshListView() { mAdapter.notifyDataSetChanged() binding.recyclerView.scrollToPosition(lines.size - 1) } /** * 验证给定的ip地址是否有效 * @param ip */ private fun isValidIpAddress(ip: String?): Boolean { if (ip.isNullOrBlank()) return false val regex = "(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})(\\.(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})){3}" val pattern = Pattern.compile(regex) val matcher = pattern.matcher(ip) return matcher.matches() } internal inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var textView: TextView = itemView.findViewById(android.R.id.text1) as TextView } internal inner class MyAdapter : RecyclerView.Adapter<MyViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { return MyViewHolder(View.inflate(parent.context, android.R.layout.simple_list_item_1,null)) } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { holder.textView.text = lines[position] } override fun getItemCount(): Int { return lines.size } } }
也可从码云中下载完整代码:https://gitee.com/daizhufei/android-ping
-
Windows命令之ping命令
2021-06-03 14:46:48PING命令是我们日常运维中诊断故障时使用频率最高的命令。ping通过向另一台 TCP/IP 计算机发送 Internet 控制消息协议 (ICMP) 回响请求消息来验证 IP 级连接。 将显示相应的回响回复消息以及往返时间。 ping 是用于...