要写一个方便使用的客户端ping服务器的小工具,记录一下关键的地方。这里使用Python的subprocess模块调用系统命令ping.exe,利用正则表达式从输出结果中提取需要的信息。subprocess模块可以和打开的子进程进行数据传递,非常方便。
这里要注意的是,子进程要使用绝对路径,不然在用py2exe打包后,会找不到可执行文件。
COUNT = ‘10’
TIMEOUT = ‘6’
PING_EXE = 'C:\Windows\System32\PING.EXE'
SEP = os.linesep
p = subprocess.Popen(
[ PING_EXE, server, '-n', COUNT, '-w', TIMEOUT],
stderr=file('nul', 'a'),
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
data = p.stdout.read().split(SEP)
data = data[-5:-1]
data中保存ping.exe输出的内容,和在cmd.exe里使用ping时的输出内容一样,最后几行包含了此次ping的汇总信息。输出的结果是str类型,用换行符来截断成list,根据最后4行来判断ping的结果。应该会有更好的方法,先这样用了。Windows下ping的结果有3种:
正常ping通,最后4行都不为空。
无法解析DNS,即unknow host。输出行数为1,len(data) == 1。
能解析,但ping不通,即100%丢包,此时输出中没有delay信息。
用来提取数据的正则表达式:
# 域名解析后的IP地址
# 输入:115.239.210.27 的 Ping 统计信息:
# 结果:['115.239.210.27']
re_ip = re.compile('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*')
# 数据包的收发统计
# 输入:数据包: 已发送 = 10,已接收 = 10,丢失 = 0 (0% 丢失)
# 结果:[('10', '10', '0', '0%')]
re_packets = re.compile('.*= ([0-9]+).*= ([0-9]+).*= ([0-9]+).*\(([0-9]+%).*')
# 数据包delay数据
# 输入:最短 = 5ms,最长 = 44ms,平均 = 9ms
# 结果:[('5', '44', '9')]
re_delay = re.compile('.*= ([0-9]+)ms.*= ([0-9]+)ms.*= ([0-9]+)ms')
更好的方法是使用基于web的工具,测试者只需要打开对应网页,就可以从测试者的机器上ping服务器。在不安装多余插件的前提下,就只有JS和ActionScript可以选择了。JavaScript是不能直接发送ICMP包的,只有采用变通的办法测试。目前在线测网速的工作大都是使用Flash实现。