2011-01-19 53 views
32

我想从我的node.js应用程序ping一台服务器。如何从Node.js应用程序“Ping”?

这样可行吗?

感谢

+2

制作ICMP消息通常需要root权限,所以如果你在UNIX上运行,你的脚本必须运行suid root,我不确定你想要那个。或者你需要能够启动一个suid root的外部进程(即ping),不知道node.js中是否有可能,但我认为它应该是? – falstro 2011-01-19 15:35:07

+0

尼古拉斯的做法可能会变慢,如果你做了很多,因为你正在分流过程(相对昂贵)。 – Alfred 2011-01-20 11:50:54

回答

12

你可以使用exec调用系统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); 
+8

你可以这样做。但是,如果你做得很多(同时),这将是昂贵的,因为分离过程昂贵(相对)。 – Alfred 2011-01-19 22:54:58

9

做平(可编程)需要root权限,因为它需要的RAW套接字需要root权限。您可以在Gradwohl's代码段执行ping命令,但请记住,您正在分配一个昂贵(相对)的新流程。如果你不需要做很多(并发),这肯定会工作:)

要做到这一点在node.js(唯一)没有派生过程我认为你有几个选项,这是很难执行:()

  1. 将此ping python library改写为node.js,然后以root用户身份运行程序。
  2. 对于node.js.使用asio c++ library编写c++ extension/addon for node.js。它也有几个例子如何做icmp ping

不(仅)使用的node.js:

  1. 使用python ping library跑了作为根,并通过与redis的实例的node.js通信。 =>EASIEST执行(几乎没有任何工作,但我认为相当快:))
  2. 再次使用asio C++编写c(++)代码,而不是写node.js扩展通过hiredis与node.js通信也使用redis。

作为一个侧面说明了如何在node.js的使用Redis的:

9

我是ping-wrapper的作者。

它产卵平,你可以立即收听事件。如果进程退出,它将自动产生。

2

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

这个简单的功能应该

  • 做DNS查找
  • 平一次
  • 超时后
  • 10秒
  • 沟通,平安提供
  • 产卵所有的虽然是出错误代码一个孩子的过程非婚姻
11

node-net-ping是一个非常棒的模块,它使用原始套接字。

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