2011-09-22 89 views
3

红宝石曾经有一个Ping.pingecho方法,但它好像(和Ping模块)已经消失一段时间:红宝石:Ping.pingecho缺少

% rvm use 1.8.7 
Using ~/.rvm/gems/ruby-1.8.7-p334 
% ruby -rping -e 'p Ping.pingecho "127.0.0.1"' 
true 
% rvm use 1.9.2 
Using ~/.rvm/gems/ruby-1.9.2-p180 
% ruby -rping -e 'p Ping.pingecho "127.0.0.1"' 
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- ping (LoadError) 
     from <internal:lib/rubygems/custom_require>:29:in `require' 
% ruby -e 'p Ping.pingecho "127.0.0.1"' 
-e:1:in `<main>': uninitialized constant Object::Ping (NameError) 

已经把它移到一个不同的库(那么应该怎么我require加载它?),或 它已被删除,并替换为一个不同的模块(所以我应该使用什么来确定IP是否可达?)。

回答

4

不知道为什么或去哪里。 Rails仍然有一个Ping类。稍微适应(使用类方法)将是:

require 'timeout' 
require 'socket' 

class Ping 
    def self.pingecho(host, timeout=5, service="echo") 
    begin 
     timeout(timeout) do 
     s = TCPSocket.new(host, service) 
     s.close 
     end 
    rescue Errno::ECONNREFUSED 
     return true 
    rescue Timeout::Error, StandardError 
     return false 
    end 
    return true 
    end 
end 

p Ping.pingecho("127.0.0.1") #=> true 
p Ping.pingecho("localhost") #=> true 
2

我刚刚遇到此问题。我以net-ping作为替代品解决了问题。它在宝石清晰的TCP平例如/净平-1.7.7 /例子/ example_pingtcp.rb:

p1 = Net::Ping::TCP.new(good, 'http') 
p p1.ping? 

rubydoc.info link在写这篇文章的时候不工作,但这里是一个有用的评论模块的源(tcp.rb)

# This method attempts to ping a host and port using a TCPSocket with 
# the host, port and timeout values passed in the constructor. Returns 
# true if successful, or false otherwise. 

所以我交换这样的:

return Ping.pingecho(server, 5, 22) 

利用该:

p = Net::Ping::TCP.new(server, 22, 5) 
p.ping? 

有两点需要说明从旧移动到新的等效模块:

  1. 构造函数的参数被颠倒
  2. 一平的实际调用是通过调用来完成(端口和超时)方法,而不仅仅是实例化。