【问题标题】:How to do ICMP ping in native NodeJS如何在本机 NodeJS 中进行 ICMP ping
【发布时间】: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/pingnpmjs.com/package/icmp(等等)。如果您不能/不会使用任何 npm 包,请说明“为什么”。
  • @paulsm4 为什么我要说为什么?它只是这个项目的一个参数。
  • 问:为什么我要说为什么? A: 呃,因为我问了,而且礼貌地回答是礼貌的。问:我为什么要问? A:因为如果这真的是一个“要求”,那似乎是武断的。如果不使用至少 ONE npm 包(“Express”、“Socket.IO”和“Passport”是流行的最爱),很难编写 ANY 非平凡的 NodeJS。此外,我希望您的 NodeJS 项目使用像 Mocha(用于测试)或 Bower(用于构建)这样的 npm 包。

标签: javascript node.js ping icmp


【解决方案1】:

没有一些外部代码,您似乎无法从 nodejs 访问 ping 等效项。

由于 ping 使用 ICMP 协议来完成它的工作(并且它必须使用该协议,因为它试图联系正在侦听该协议的端点)并且在 nodejs 中没有实现 ICMP 协议,因此您唯一的选择将是通过访问 RAW OS 套接字并自己实现协议,完全在 nodejs 代码中创建自己的 ICMP 协议实现。我不知道在普通 nodejs 中获取 RAW 套接字的任何内置功能(无外部软件)。

我可以在 nodejs 中找到的唯一 ICMP 实现示例全部使用外部代码来创建对原始套接字的访问。这似乎证明了没有其他方法可以做到这一点。

有一个模块here 公开了一个原始套接字,但它使用一些本机代码来实现它。你可以检查它的实现,看看它在做什么。

还有this library,它从 libuv 公开一个 RAW 套接字以在 nodejs 中使用,但它也使用一些它自己的本机代码。

【讨论】:

  • 是的,问题是我需要 node-gyp,正如我在问题中提到的,我项目的一个不可动参数是避免使用 NPM / Node-GYP。不过谢谢你的想法。
  • @ValentinoZaffrani - 我将这些作为示例发布,表明如果没有将一些本机代码添加到 nodejs 中,您将无法访问 RAW OS 套接字(在该套接字上您可以实现 ping 使用的 ICMP 协议)某处。所以你的答案是“不,如果没有 nodejs 之外的额外资源,你就无法执行 ping”。
  • @ValentinoZaffrani - 这是an article 在 nodejs 中实现 ICMP 的另一个例子,它是如何使用外部包来访问原始套接字的另一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
相关资源
最近更新 更多