如何从 Node.js 应用程序“Ping”?

问题描述 投票:0回答:7

我想从我的 Node.js 应用程序 ping 服务器。

这可行吗?

谢谢

node.js
7个回答
42
投票

您可以使用

exec
来调用系统ping命令

var exec = require('child_process').exec;
exec("ping -c 3 localhost", function (err, stdout, stderr) {
    console.log(stdout);
});

27
投票

node-net-ping是一个使用原始套接字的很棒的模块。

而且,如果您只寻找原始套接字,同一开发人员也有一个模块:node-raw-socket


10
投票

我是ping-wrapper的作者。

它会产生 ping,您可以立即监听事件。如果进程退出,它将自动生成。


9
投票

执行 ping(可编程)需要 root 权限,因为它需要需要 root 访问权限的原始套接字。您可以按照 Gradwohl's 代码片段执行 ping,但请记住,您正在分叉一个新进程,该进程相对昂贵。如果你不需要做很多事情(并发),这肯定会起作用:)

要在node.js(仅)中执行此操作而无需分叉过程,我认为您有几个选项,但都很难实现:()

  1. 将这个 ping python 库重写到node.js,然后以 root 用户身份运行程序。
  2. 使用 Node.js 的 asio c++ 库为 Node.js 编写一个 c++ 扩展/插件。它还提供了几个如何执行 icmp ping 的示例。

不(仅)使用node.js:

  1. 使用 python ping 库 以root身份运行并通过redis与node.js实例通信。 => 最容易实现。(几乎没有任何工作,但我认为相当快:))
  2. 使用asio c++再次编写c(++)代码,但不编写node.js扩展,通过hiredis与也使用redis的node.js进行通信。

作为旁注,如何在 Node.js 上使用 Redis:


3
投票

您还可以使用我的nodejs ping 包装器yaping。有一天,我们将在 Nodejs 中获得原始套接字,并且我们将能够制作自己的 ping 数据包并谎报我们的响应时间。 ;-)

这个简单的功能应该

  • 进行 DNS 查找
  • ping一次
  • 10秒后超时
  • 传达 ping 提供的所有详细错误代码
  • 非婚生子进程

2
投票

这是一个关于如何使用

node:net
模块创建 TCP 连接并 ping 主机的基本示例。

import { createConnection } from 'node:net';

/**
 * Ping a given host and resolve with the response time in milliseconds,
 * or -1 if there was an error.
 */
async function ping(hostname, port = 80, timeout = 3000) {
  return new Promise((resolve) => {
    const start = performance.now();
    const socket = net.createConnection(port, hostname);
    socket.setTimeout(timeout);
    socket.on('connect', () => {
      const end = performance.now();
      socket.end();
      resolve(end - start);
    });

    function handleError() {
      socket.destroy();
      resolve(-1);
    }

    socket.on('timeout', handleError);
    socket.on('error', handleError);
  });
}

console.log(await ping('stackoverflow.com'));

此外,还有另一种方法可以使用

node:child_process
模块来完成此操作,但不建议这样做,因为它可以 在某些情况下相当昂贵。

参考文献


0
投票

工作正常,

const { exec } = require("child_process");
exec("ping -c 10 google.com", (error, stdout, stderr) => {
    if (error) {
        console.log(`error: ${error.message}`);
        return;
    }
    if (stderr) {
        console.log(`stderr: ${stderr}`);
        return;
    }
    console.log(`stdout: ${stdout}`);
});

© www.soinside.com 2019 - 2024. All rights reserved.