小惠 2010-10-09
最近在写个程序用Runtime.exec来执行操作系统的ping命令以获得目标网络信息。
但是在solaris却遇到了困难,就是无法指定发包数量,需要手工ctrl+c停止命令,才会有统计信息的输出,后来研究了一把,终于得到了解决办法,下面先分享下各个系统上的ping命令是如何指定发包数的。
大家应该对windows下的ping很熟悉了。我们执行ping命令时,默认发送4个数据包,可以通过n参数指定发包数,并且最后还有个统计数据,如:
C:\DocumentsandSettings\Administrator>ping-n2192.168.0.134
Pinging192.168.0.134with32bytesofdata:
Requesttimedout.
Requesttimedout.
Pingstatisticsfor192.168.0.134:
Packets:Sent=2,Received=0,Lost=2(100%loss),
C:\DocumentsandSettings\Administrator>
而linux上也可以指定发包数,如:
[root@eomssso1~]#ping-c310.243.24.3
PING10.243.24.3(10.243.24.3)56(84)bytesofdata.
64bytesfrom10.243.24.3:icmp_seq=1ttl=255time=4.36ms
64bytesfrom10.243.24.3:icmp_seq=2ttl=255time=0.266ms
64bytesfrom10.243.24.3:icmp_seq=3ttl=255time=0.258ms
---10.243.24.3pingstatistics---
3packetstransmitted,3received,0%packetloss,time1998ms
rttmin/avg/max/mdev=0.258/1.628/4.360/1.931ms
[root@eomssso1~]#
经过研究solaris下的ping参数,发现其实也是可以实现发送指定的数据包,只不过参数的选择上有些特定的规则,先看效果,效果如下:
root@temip#ping-s10.243.24.3564
PING10.243.24.3:56databytes
64bytesfromemipserver1(10.243.24.3):icmp_seq=0.time=0.ms
64bytesfromemipserver1(10.243.24.3):icmp_seq=1.time=0.ms
64bytesfromemipserver1(10.243.24.3):icmp_seq=2.time=0.ms
64bytesfromemipserver1(10.243.24.3):icmp_seq=3.time=0.ms
----10.243.24.3PINGStatistics----
4packetstransmitted,4packetsreceived,0%packetloss
round-trip(ms)min/avg/max=0/0/0
root@temip#
这里有3个重要的参数,-s、56和4,其中-s可以替换为-I,56为指定数据包大小,4表示发包次数为4次。
这3个参数缺一不可,我们来试试运行ping-s10.243.24.314,指定数据包大小为1,结果如下:
root@temip#ping-s10.243.24.314
PING10.243.24.3:1databytes
9bytesfromemipserver1(10.243.24.3):icmp_seq=0.
9bytesfromemipserver1(10.243.24.3):icmp_seq=1.
9bytesfromemipserver1(10.243.24.3):icmp_seq=2.
9bytesfromemipserver1(10.243.24.3):icmp_seq=3.
----10.243.24.3PINGStatistics----
4packetstransmitted,4packetsreceived,0%packetloss
root@temip#
可以发现,如果指定的数据包太小,则没有最大最小及平均耗时的统计(需要>=8),