2011-01-19 40 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