Ruby: Ping.pingecho отсутствует - PullRequest
       12

Ruby: Ping.pingecho отсутствует

3 голосов
/ 22 сентября 2011

В Ruby раньше использовался метод Ping.pingecho, но кажется, что (и модуль Ping) как-то исчезли:

% 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?).

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Не знаю, почему или куда оно ушло. 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
3 голосов
/ 14 июля 2015

Я только что столкнулся с этой проблемой.Я согласился с драгоценным камнем net-ping в качестве замены.Он имеет четкий пример TCP-пинга в gems / net-ping-1.7.7 / examples / example_pingtcp.rb:

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

Ссылка rubydoc.info на момент написания этой статьине работает, но вот полезный комментарий в источнике модуля (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. Фактическийвызов ping выполняется путем вызова метода ping?, а не просто создания экземпляра.
...