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

9q78igpj  于 2022-11-22  发布在  Node.js
关注(0)|答案(8)|浏览(329)

我想从node.js应用程序ping服务器。
这可行吗?
谢谢

des4xlb0

des4xlb01#

您可以使用exec调用system ping命令

var sys = require('sys')
var exec = require('child_process').exec;
function puts(error, stdout, stderr) { sys.puts(stdout) }
exec("ping -c 3 localhost", puts);
mpgws1up

mpgws1up2#

node-net-ping是一个使用原始套接字的令人敬畏的模块。
而且,如果您只寻找原始套接字,同一个开发人员也有一个模块:是的。

dxpyg8gm

dxpyg8gm3#

我是ping-wrapper的作者。
它产生ping,您可以立即监听事件。如果进程退出,它将自动产生。

holgip5t

holgip5t4#

执行ping(可编程)需要root权限,因为它需要raws socket,而raws socket需要root权限。您可以按照Gradwohl的代码片段执行ping,但请记住,您正在派生一个新的进程,这是昂贵的(相对而言)。如果您不需要做很多(并发),这肯定会工作:)
要在node.js(仅)中执行此操作而不使用forking进程,我认为您有两个选项,这两个选项都很难实现:()
1.将此ping python library重写为node.js,然后以root用户身份运行程序。
1.使用asio c++ library为node.js编写一个c扩展/addon。它也有几个如何执行icmp ping的示例。
不(仅)使用node.js:
1.使用python ping library作为root运行并通过redis与node.js示例通信。=〉最容易实现。(几乎没有任何工作,但我认为相当快:))
1.再次使用asio c
编写c(++)代码,但不是编写node.js扩展,而是通过hiredis与也使用redis的node.js通信。
作为旁注,如何在node.js上使用redis:

dxxyhpgq

dxxyhpgq5#

你也可以使用我的nodejs ping Package 器yaping。总有一天,我们会在nodej中得到原始套接字,我们将能够制作自己的ping包,并谎报我们的响应时间。- )
这个简单的函数应该

  • 执行dns查找
  • ping一次
  • 10秒后超时
  • 尽管ping提供了错误代码,但仍能很好地进行通信
  • 非婚生子进程
gzszwxb4

gzszwxb46#

我知道这个答案在相当长的一段时间前就已经有了答案,但是对于正在寻找同样答案的人来说,我已经在github上写了一个模块,尝试更多地简化它:)
https://github.com/bscarvell/pingwrap

dly7yett

dly7yett7#

它工作正常,

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}`);
});
vybvopom

vybvopom8#

有几种方法可以做到这一点。最简单的是使用ping命令。你可以通过使用child_process模块来做到这一点。

const { spawnSync } = require('child_process');
const os = require('os');

// Windows: ping -n 1 HOSTNAME
// Linux: ping -c 1 HOSTNAME

function pingHostname(hostname) {
   const result = spawnSync('ping', os.platform() === 'win32' ? ['-n', '1', hostname] : ['-c', '1', hostname]);
   return result.stdout.toString().includes('Reply from');
}

或者,您可以使用net模块来ping服务器。

const net = require('net');

async function pingHostname(hostname) {
   return new Promise((resolve, reject) => {
      const socket = net.createConnection(80, hostname);
      socket.setTimeout(3000);
      socket.on('connect', () => {
         socket.end();
         resolve(true);
      });
      socket.on('timeout', () => {
         socket.destroy();
         resolve(false);
      });
      socket.on('error', () => {
         socket.destroy();
         resolve(false);
      });
   });
}

参考

相关问题