2010-08-24 53 views
12

我想在我的ruby代碼中ping一個站點,並看到net-ping是一個很好的庫。不幸的是,當我試圖創業板安裝網平,我得到了以下錯誤:ruby​​ ping for 1.9.1

C:>gem install net-ping
ERROR: Error installing net-ping:
win32-open3 requires Ruby version < 1.9.0.

在進一步的研究,我發現,網上平是尚不可用於1.9.x中有沒有人有一個很好的代碼,他們願意分享。

+0

如果你確實需要做ICMP ping,你總是可以使用本地操作系統工具,比如「ping -c 1 host」並解析結果。 – taro 2010-08-25 11:04:14

回答

12

你總是可以做到這一點,並使用正則表達式解析的結果,或只是檢查退出狀態:

ping_count = 10 
server = "www.google.com" 
result = `ping -q -C#{ping_count} #{server}` 
if ($?.exitstatus == 0) do 
    puts "Device is up!" 
end 

平安返回值,你可以對證:

The ping utility returns an exit status of zero if at least one response was heard from the specified host; a status of two if the transmission was successful but no responses were received; or another value (from <sysexits.h>) if an error occurred.

http://www.manpagez.com/man/8/ping

+0

只需檢查一下設備是否啓動,然後再運行我的其他代碼即可。另外,試過你的代碼,我如何看到ping的結果? – rahrahruby 2010-08-25 15:33:05

+0

查看編輯答案。 – Mahmoud 2010-08-25 19:36:39

+2

這是我需要使用'''ping -t 1 ipinfodb.com''''''''''有一個工作超時的地方,並找出ipinfodb.com是否在線提示。 Timeout和SystemTimer都不能以某種方式工作,並等待60秒完成錯誤。謝謝! – 2011-05-16 09:34:06

14

如果通過'網站'你的意思是網站,那麼我不會使用ping。 Ping會告訴你主機是否啓動(除非路由器或防火牆阻止了ICMP),但它不會告訴你網絡服務器或Web應用程序是否正確響應。

如果是這樣的話,我建議從標準庫或任何其他HTTP庫的Net :: HTTP。做到這一點的方法之一是:

def up?(site) 
    Net::HTTP.new(site).head('/').kind_of? Net::HTTPOK 
end 

up? 'www.google.com' #=> true 
+1

此網站還可以拒絕非瀏覽器請求。比較www.habrahabr.ru和www.google.ru。因此,您需要更密切地查看響應和/或使用用戶代理。 – Nakilon 2010-08-28 11:31:19

+0

我在windows上遇到了這個代碼的問題,接收到一個工作網站的「壞門戶」。我可以使用「get」而不是「head」來解決它。也許這有助於窗戶上的人。 – mit 2012-07-08 21:44:02

+0

@mit聽起來像是你碰到了一個不符合規範並且無法處理'HEAD'請求的代理。很高興你能用'get'工作。 – 2012-07-08 23:18:15

1

source

gem "net-ping", :git => 'git://github.com/djberg96/net-ping.git' 
# bundle install 

使用現在,你可以在1.9.2

2

使用功能,從用於Windows遵循以下步驟:

download djberg96-net-ping-net-ping-1.5.3-0-g9252076.zip from github.com/djberg96/net-ping 
unzip, cd in the folder 
gem build net-ping.gemspec 
gem install net-ping-1.5.3-universal-mingw32.gem 
gem install win32-security 

使用它:

require 'net/ping' 
p Net::Ping::TCP.new('www.google.com', 'http').ping? 
p Net::Ping::TCP.new('foo.bar.baz').ping?