Ruby net / ping возвращает false для Google? (Работает из командной строки) - PullRequest
0 голосов
/ 12 декабря 2011

Я могу пропинговать Google с моего локального компьютера, но кто-нибудь может сказать мне, почему я могу получить "false", когда я запускаю следующее в IRB на той же машине? Действительно расстраивать как пинг, должно быть, самая простая сетевая операция, и я просто не могу заставить его работать!

1.9.2-p290 :001 > require "net/ping"
 => true 
1.9.2-p290 :003 > pinger = Net::Ping::External.new("http://www.google.com")
 => #<Net::Ping::External:0x88eac30 @host="http://www.google.com", @port=7, @timeout=5, @exception=nil, @warning=nil, @duration=nil> 
1.9.2-p290 :004 > pinger.ping
 => false 
1.9.2-p290 :005 > 

Ответы [ 2 ]

4 голосов
/ 12 декабря 2011

Ниже указано , а не действительное имя хоста / домена (хотя это действительный URL ):

http://www.google.com

Таким образом, разрешение DNS не будет выполнено, и при отсутствии целевого IP-адреса пинг отправляться не будет.

Я уверен, что вы не использовали этот точный хост для командной строки ping :) Как отмечает Гарет, это будет выглядеть примерно так:

$ ping http://www.google.com
ping: cannot resolve http://www.google.com: Unknown host

A «обычный пинг» , который здесь делается, и «пинг HTTP» различаются. Сравните это использование с Net::Ping::HTTP, который делает , например, URL-адрес.

Удачного кодирования.


(Подходящими именами хостов могут быть "google.com" или "www.google.com".)

2 голосов
/ 12 декабря 2011

Если вы пытаетесь проверить, работает ли сайт, я бы не использовал ping. Ping сообщит вам, работает ли хост (если маршрутизатор или брандмауэр не блокирует ICMP), но не сообщит, правильно ли реагирует ваш веб-сервер или веб-приложение.

В таком случае я бы порекомендовал Net :: HTTP из стандартной библиотеки или любой другой библиотеки HTTP. Один из способов сделать это:

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

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