Как обработать тайм-аут с помощью net / http в ruby ​​при отправке запросов на IP-адреса с заданного диапазона IP-адресов и пропустить IP-адреса с тайм-аутом и перейти к следующим? - PullRequest
0 голосов
/ 20 февраля 2012

Я хочу обработать тайм-аут для диапазона IP-адресов, взятого с консоли, для которого я делаю запросы к IP-адресам в пределах взятого диапазона и получаю ошибку тайм-аута.Я хочу делать запросы ко всем IP и получать ответы от них.Для IP-адреса, который истек, нужно пропустить его и перейти к следующему.Как это сделать, чтобы цикл не получал исключение, и скрипт отправлял запрос на все IP-адреса, которые могут дать время ожидания ответа.

Присоединение кода здесь:

require 'net/http'
require 'uri'
require 'ipaddr'

puts "Origin IP:"
originip = gets()
(IPAddr.new("209.85.175.121")..IPAddr.new("209.85.175.150")).each do |address|
  req = Net::HTTP.get(URI.parse("http://#{address.to_s}"))
  puts req
end

Ошибка:

C:/Ruby187/lib/ruby/1.8/net/http.rb:560:in `initialize': A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. - connect(2) (Errno::ETIMEDOUT)
        from C:/Ruby187/lib/ruby/1.8/net/http.rb:560:in `open'
        from C:/Ruby187/lib/ruby/1.8/net/http.rb:560:in `connect'
        from C:/Ruby187/lib/ruby/1.8/timeout.rb:53:in `timeout'
        from C:/Ruby187/lib/ruby/1.8/timeout.rb:101:in `timeout'
        from C:/Ruby187/lib/ruby/1.8/net/http.rb:560:in `connect'
        from C:/Ruby187/lib/ruby/1.8/net/http.rb:553:in `do_start'
        from C:/Ruby187/lib/ruby/1.8/net/http.rb:542:in `start'
        from C:/Ruby187/lib/ruby/1.8/net/http.rb:379:in `get_response'
        from C:/Ruby187/lib/ruby/1.8/net/http.rb:356:in `get'
        from IP Range 2.rb:9
        from IP Range 2.rb:8:in `each'

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Так же, как говорит Марк.Вы должны спасти исключение.Вот так:

begin
  response = Net::HTTP.get(...)
rescue Errno::ECONNREFUSED => e
  # Do what you think needs to be done
end

Кроме того, то, что вы получаете от звонка на get(), является ответом, а не запросом.

0 голосов
/ 20 февраля 2012

Поймать исключение, используя timeout ,

require 'timeout'

(IPAddr.new("209.85.175.121")..IPAddr.new("209.85.175.150")).each do |address|
  begin
    req = Net::HTTP.get(URI.parse("http://#{address.to_s}"))
    puts req
  rescue Timeout::Error => exc
    puts "ERROR: #{exc.message}"
  rescue Errno::ETIMEDOUT => exc
    puts "ERROR: #{exc.message}"
  # uncomment the following two lines, if you are not able to track the exception type.
  #rescue Exception => exc
  #  puts "ERROR: #{exc.message}"
  end
end

Редактировать: Когда мы спасаем Timeout::Error, будут ловиться только те исключения, которые принадлежат классу Timeout::Error.Нам нужно отловить возникшее исключение, используя класс ошибок, соответственно обновив код.

...