我正在使用Wireshark的Tshark cmd工具捕获一些网络数据包并对其进行分析。为了生成工作环境,您只需要Wireshark 3+和NodeJS 9+。我正在使用下面的代码在某个时间截断Tshark流(setTimeout用于模拟用户同时单击停止按钮)
var spawn = require('child_process').spawn,
ts = spawn('tshark', ['-i', 'Wi-Fi', '-T', 'json']);
function analyzePacket(packet) {
console.log(packet.toString());
}
ts.stdout.on('data', function (packet) {
analyzePacket(packet)
});
setTimeout(function(){ ts.kill(); }, 5000);
但是,当调用ts.kill();
时,将数据包信息写到屏幕中间会很好地工作。我希望tshark完全输出在单击停止按钮(触发ts.kill())之前捕获的最后一个数据包。我试着发送了不同的信号,据我所知,不同的信号在杀死的严酷程度上有所不同。如下所示:
ts.kill('SIGINT');
ts.kill('SIGHUP');
ts.kill('SIGKILL');
它们似乎都不起作用。这是实现最终数据包完全,然后优雅地关闭的最好方法。
发布于 2019-09-11 11:42:26
Tshark的性质
tshark在捕获数据包时总是处于解析数据包的过程中。对于你来说,没有一种方法可以让它在终止之前完成对数据包的解析。如果您希望它在某个条件后正常退出,-a duration:NUM
将在NUM秒后停止,-c NUM
将在NUM数据包之后停止。
可能的解决方案
如果您确实需要用户点击kill按钮时到达数据包,为什么不在收到信号后等待100ms,然后kill?这将捕获有问题的数据包,并且不会被用户注意到。
发布于 2019-09-11 13:27:18
不是在setTimeout中终止进程,而是创建一个函数并在收到数据时调用该函数。
function killPocess(){
ts.kill();
}
function analyzePacket(packet) {
console.log(packet.toString());
killPocess(); // kill the process as packet is received
}
https://stackoverflow.com/questions/57872867
复制相似问题