【发布时间】:2021-11-11 08:32:19
【问题描述】:
同志们怎么样,几天前我试图从 NodeJS 对一个 IP 进行 ICMP ping。但是按照论坛的规定,我不是空手来的,我在这个网站上也看到过一些帖子在谈论如何做到这一点,但没有一个能说服我。
我的项目不可动摇的参数之一是避免使用 NPM / Node-GYP。因此放弃使用原始套接字的选项(除非您可以在 NodeJS 中使用 C++ 代码而不使用节点本身外部的东西)。
还尝试(并实现)了使用系统命令的选项,在这里您可以看到我在 Linux 和 Windows 上的有效实现(我没有在 Mac 上尝试过,但我几乎可以肯定它可以工作)
'use strict';
import { execSync } from "child_process";
class Ping {
#stdoutToMS (stdout) {
let res;
let a = stdout.split('=');
for (let i = 0; i < a.length; i++) {
res = a[i].split("ms");
}
return ~~res[0].split('/')[0].trim();
}
ping (host, timeout = 5000) {
let mstout = timeout / 1000;
let stdout;
try {
if (process.platform === "win32") {
stdout = execSync("ping -n 1 -l 1 -w " + timeout + ' ' + host);
} else {
stdout = execSync("ping -c 1 -s 16 -W " + mstout + ' ' + host);
}
} catch (err) {
return false;
}
return this.#stdoutToMS(stdout.toString());
}
};
export default Ping;
如果有人对如何在不使用外部软件的情况下在节点中本地执行此操作有任何想法,如果您能告诉我,我将不胜感激。
【问题讨论】:
-
这能回答你的问题吗? How to "Ping" from a Node.js app?
-
@JBaczuk No Sr,基于这个问题的stackoverflow.com/a/4741996/15924727 回答,我构建了我的基于操作系统的小型 ping 库。我正在寻找一种没有 node-gyp / npm 且不使用外部软件的方法。
-
问:当你说“避免使用 NPM / Node-GYP”时,你DON'T的意思是“避免使用 ANY npm 包” , 你?建议:请考虑npmjs.com/package/ping 或npmjs.com/package/icmp(等等)。如果您不能/不会使用任何 npm 包,请说明“为什么”。
-
@paulsm4 为什么我要说为什么?它只是这个项目的一个参数。
-
问:为什么我要说为什么? A: 呃,因为我问了,而且礼貌地回答是礼貌的。问:我为什么要问? A:因为如果这真的是一个“要求”,那似乎是武断的。如果不使用至少 ONE npm 包(“Express”、“Socket.IO”和“Passport”是流行的最爱),很难编写 ANY 非平凡的 NodeJS。此外,我希望您的 NodeJS 项目使用像 Mocha(用于测试)或 Bower(用于构建)这样的 npm 包。
标签: javascript node.js ping icmp