Created
August 21, 2012 08:45
-
-
Save atian25/3413656 to your computer and use it in GitHub Desktop.
PING操作-简单封装
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* PING测试 | |
* @example | |
* var ping = require('./lib/ping'); | |
* ping('www.baidu.com',function(err,result){ | |
* console.log(result,err) | |
* }) | |
*/ | |
"use strict"; | |
var os = require('os'); | |
var spawn = require('child_process').spawn; | |
var iconv = require('iconv-lite'); | |
var BufferHelper = require('bufferhelper'); | |
var _ = require('underscore')._; | |
/** | |
* ping | |
* @param {Object/String} options ping的参数,当为String时为url。 | |
* - url 目标地址 | |
* - size 包大小,默认为32 | |
* - count 次数,默认为5 | |
* @param {Function} callback 回调函数 | |
* - error 无异常时为null | |
* - data 执行结果 | |
*/ | |
exports = module.exports = function(options, callback){ | |
options = _.defaults(_.isString(options)?{url:options}:options,{size:32,count:5,startTime:new Date()}); | |
//组装指令 | |
var cmd; | |
if(os.platform().match(/win/ig)){ | |
cmd = spawn('ping',[options.url,'-n',options.count,'-l',options.size]); | |
}else{ | |
cmd = spawn('ping',[options.url,'-c',options.count,'-s',options.size]); | |
} | |
//捕获输出 | |
var bufferHelper = new BufferHelper(); | |
cmd.stdout.on('data', function(data){ | |
bufferHelper.concat(data); | |
}); | |
cmd.stderr.on('data', function(data) { | |
bufferHelper.concat(data); | |
}); | |
cmd.on('exit',function(code,signal){ | |
var str = iconv.decode(bufferHelper.toBuffer(),'gbk'); | |
_.defaults(options,{ | |
endTime: new Date(), | |
originalResult: str, | |
resultCode: code, | |
signal: signal | |
}) | |
var obj = decode(options); | |
callback(code,obj); | |
}); | |
} | |
/** | |
* 解码输出,计算指标 | |
* @param {Object} obj | |
* - url 目标地址 | |
* - size 包大小,默认为32 | |
* - count 次数,默认为5 | |
* - startTime 开始时间 | |
* - endTime 结束时间 | |
* - originalResult 原始结果 | |
* - resultCode 结果码 | |
* - errorDescription 错误描述 | |
* - successCount 成功次数 | |
* - failCount 失败次数 | |
* - lostRate 丢包率 | |
* - avgDelay 平均时延 | |
* - maxDelay 最大时延 | |
* - minDelay 最小时延 | |
* - pcapFile 抓包文件 //TODO | |
* @return {Object} 填充原对象 | |
*/ | |
function decode(obj){ | |
var data = obj.originalResult; | |
//成功的解码 | |
if(!obj.resultCode){ | |
//判断操作系统 | |
if(os.platform().match(/win/ig)){ | |
// E:\Workspace\TZ\LTE-Test\client>ping www.baidu.com | |
// 正在 Ping www.a.shifen.com [220.181.111.147] 具有 32 字节的数据: | |
// 来自 220.181.111.147 的回复: 字节=32 时间=75ms TTL=53 | |
// 请求超时。 | |
// 来自 220.181.111.147 的回复: 字节=32 时间=57ms TTL=53 | |
// 来自 220.181.111.147 的回复: 字节=32 时间=42ms TTL=53 | |
// 220.181.111.147 的 Ping 统计信息: | |
// 数据包: 已发送 = 4,已接收 = 3,丢失 = 1 (25% 丢失), | |
// 往返行程的估计时间(以毫秒为单位): | |
// 最短 = 42ms,最长 = 75ms,平均 = 58ms | |
obj.successCount = Number(data.match(/已接收 = (\d+)/)[1]); | |
obj.failCount = Number(data.match(/丢失 = (\d+)/)[1]); | |
obj.lostRate = Number(data.match(/(\d+)% 丢失/)[1]); | |
obj.avgDelay = Number(data.match(/平均 = (\d+)ms/)[1]); | |
obj.maxDelay = Number(data.match(/最长 = (\d+)ms/)[1]); | |
obj.minDelay = Number(data.match(/最短 = (\d+)ms/)[1]); | |
}else{ | |
// tz@tz-ubuntu:/opt$ ping www.baidu.com | |
// PING www.a.shifen.com (220.181.112.143) 56(84) bytes of data. | |
// 64 bytes from 220.181.112.143: icmp_req=1 ttl=53 time=56.0 ms | |
// 64 bytes from 220.181.112.143: icmp_req=2 ttl=53 time=54.0 ms | |
// 64 bytes from 220.181.112.143: icmp_req=3 ttl=53 time=57.0 ms | |
// --- www.a.shifen.com ping statistics --- | |
// 3 packets transmitted, 3 received, 0% packet loss, time 10121ms | |
// rtt min/avg/max/mdev = 54.055/55.708/57.034/1.252 ms | |
obj.successCount = Number(data.match(/(\d+) received/)[1]); | |
obj.failCount = Number(data.match(/(\d+) packets transmitted/)[1]) - obj.successCount; | |
obj.lostRate = Number(data.match(/(\d+)% packet loss/)[1]); | |
var tmp = data.match(/mdev = (.*?) ms/)[1].split('/'); | |
obj.minDelay = Number(tmp[1]); | |
obj.avgDelay = Number(tmp[2]); | |
obj.maxDelay = Number(tmp[3]); | |
} | |
if(obj.needOriginal){ | |
obj.originalResult = data.split(/\r?\n/); | |
}else{ | |
delete obj.originalResult; | |
} | |
}else{ | |
obj.errorDescription = data; | |
} | |
return obj; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment