精华内容
下载资源
问答
  • Ping命令详解 千次阅读
    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命令主要用来测试主机之间网络的连通性,也可以用于。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。 不过值得我们注意的是:...
  • 使用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命令实用程序。 用Flutter制作的Pinger Ping命令实用程序。 使用的库,工具和服务:(一些)社区软件包:mobx冻结的可注入fl_chart Firebase Firestore应用程序分发Crashlytics Fastlane ...
  • python实现ping命令

    2018-05-10 17:32:13
    python实现ping命令。python实现ping命令。python实现ping命令
  • 路由器ping不通.原因众多...现在简单讲以下几点:使用PING判断TCP/IP故障以及Ping命令的使用注意,感兴趣的朋友可以参考下哈,希望对大家有所帮助
  • ping命令带时间.编辑批次档,将8.8.8.8改成自己需要的测试IP地址. 以便于分析网络异常的时间点.还可以编辑批次档,加上>d:\ping.bat .将记录保存起来.
  • 易语言ping命令源码
  • 可以有效保存附带时间的ping记录,方便网络监测和事后故障回顾,是方便从事网络工作者的小工具,批脚本文件,无需修改脚本文件,直接运行,输入需要ping的IP地址或域名即可,Ctrl+C暂停,Y退出,C取消
  • 带时间戳ping命令.bat

    2020-05-19 15:45:12
    带时间戳ping命令,方便用户诊断断网的时间是什么时候,有效协作诊断网络问题。运行后生成的文件位于D盘1213.txt 文件
  • C语言: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命令包及解析详解 前言: MySQL客户端可以用ping命令来检查服务端的状态,正常会返回ok包。 mysql通信报文结构 类型 名字 描述 int payload长度 按照the least significant byte first存储,...
  • C++实现ping命令的功能(Windows),使用WinSock2.h借助Windows API实现ping命令已经域名解析功能。
  • C++写的,和正常用cmd去ping命令一样的操作,需要可以下载看看
  • java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ...
  • 一般的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 Delphi实现可视化单步执行的Ping命令,在框内输入IP地址,点击“执行Ping”按钮,将执行一次Ping命令,不能连续执行Ping操作,不过大家稍加改进,模拟出像Windows一样的Ping功能...
  • 第 第 PAGE 1 页 共 NUMPAGES 1 页 linux的ping命令设置时间间隔 Linux下ping命令可以设置每次ping的时间间隔下面由小编为大家整理了linux下ping命令设置时间间隔的相关知识希望对大家有帮助! linux的ping命令设置...
  • ping 命令

    千次阅读 2019-12-31 15:28:43
    ping命令是定位网络通不通的一个重要手段。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 -?来查看

               学以致用,多多实践!

     

    展开全文
  • 有时候大家上网时偶尔会有这样的需求,譬如说查看自己的Ping啊,DNS等等,这款应用就正好可以满足你,输入网址或者IP地址就可以查询Ping、DNS以及WHOIS、HTTP headers、traceroutes等等。 【基本信息】 作者:Ulf ...
  • H3C经典Ping命令详解

    热门讨论 2015-07-14 22:07:50
    H3C经典Ping命令详解,简单实用,免费下载
  • PING的一些参数: 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就够了,超时时间一般是不用设置的,用默认的就好了。

    1. Windows ping简单使用:ping -l 128 -t baidu.com
      - l 设置数据包大小为128 bytes
      - t 设置一直不停地ping
      - 示例如下:
      在这里插入图片描述

    2. Linux ping简单使用:ping -s 120 -w 20 baidu.com
      - s 设置数据包大小为120 bytes,实际发送数据包时是128bytes,据说是会包含一些头信息什么的需要额外的8bytes,据我的实验,在Android手机中,默认是1秒ping一次,包含超时时间在里面,比如ping 20秒,不管网络好与不好,20秒后,看统计信息会显示发送的刚好是20个包。
      - w设置总的ping时间为20秒
      - 示例如下:
      在这里插入图片描述

    3. 查看ping参数说明

      • Windows直接输入ping即可,如下:
        在这里插入图片描述
      • Linux也是直接输入ping,如下:
        在这里插入图片描述
        如果是在Linux电脑(在Android系统上不行),还可以使用man ping查看ping命令的详细使用手册,如下:
        在这里插入图片描述
        在这里插入图片描述
        这个手册非常详细,从这里可以看到-w和-W的单位为秒,百度里找到的文章大多数说是毫秒,真是一个个都是转载别人的,一个错个个错,所以,尽量找官网文档看,比较准确。

    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:48
    PING命令是我们日常运维中诊断故障时使用频率最高的命令。ping通过向另一台 TCP/IP 计算机发送 Internet 控制消息协议 (ICMP) 回响请求消息来验证 IP 级连接。 将显示相应的回响回复消息以及往返时间。 ping 是用于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 300,889
精华内容 120,355
关键字:

ping命令