Skip to content

Instantly share code, notes, and snippets.

@atian25
Created August 21, 2012 08:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atian25/3413656 to your computer and use it in GitHub Desktop.
Save atian25/3413656 to your computer and use it in GitHub Desktop.
PING操作-简单封装
/**
* 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