如何在本机 NodeJS 中执行 ICMP ping

How to do ICMP ping in native NodeJS

战友们呢,前几天在NodeJS尝试ICMP ping一个IP。但是按照论坛的规则,我不会空手而归,我什至在这个网站上也看到过一些帖子在谈论如何做到这一点,但是 none 说服了我。

我项目的一个固定参数是避免使用 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;

如果有人对如何在不使用外部软件的情况下在节点中本地执行此操作有任何想法,请告诉我,我将不胜感激。

您似乎无法在没有一些外部代码的情况下从 nodejs 访问等效的 ping。

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

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

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

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