Сбой Ruby в Windows при работе с IPv6? - PullRequest
0 голосов
/ 12 июля 2010

Итак, у меня есть инструмент, который я встроил в Ruby, который использует net/http для выполнения некоторых запросов к внешней REST-службе. Я собрал и протестировал этот инструмент с помощью Windows 7, и он работал абсолютно нормально.

Теперь, поскольку этот инструмент предназначен для периодического запуска на одном из наших серверов (под управлением Windows Server 2008 R2), я развернул его там, и внезапно он вышел из строя со следующим исключением:

SocketError: getaddrinfo: The storage control blocks were destroyed.
  C:/Ruby187/lib/ruby/1.8/net/http.rb:560:in `initialize'
  C:/Ruby187/lib/ruby/1.8/net/http.rb:560:in `open'
  C:/Ruby187/lib/ruby/1.8/net/http.rb:560:in `connect'
  C:/Ruby187/lib/ruby/1.8/timeout.rb:53:in `timeout'
  C:/Ruby187/lib/ruby/1.8/timeout.rb:93:in `timeout'
  C:/Ruby187/lib/ruby/1.8/net/http.rb:560:in `connect'
  C:/Ruby187/lib/ruby/1.8/net/http.rb:553:in `do_start'
  C:/Ruby187/lib/ruby/1.8/net/http.rb:542:in `start'
  C:/Ruby187/lib/ruby/1.8/net/http.rb:1035:in `request'
  C:/Ruby187/lib/ruby/1.8/net/http.rb:772:in `get'
    ...

Немного Googling показывает, что это может быть причиной сбоя Ruby при работе с IPv6 на компьютере с Windows. Однако: он отлично работает на этом компьютере с Windows 7, у которого включен полный стек IPv6, подключен к той же сети , а даже имеет точно такую ​​же установку Ruby, что и сервер 2K8, который не с этим сообщением об ошибке.

Ниже приведен простейший тестовый пример, в котором завершается с ошибкой (ошибки, за исключением указанного выше) в Windows Server 2008, но проходит в Windows 7:

require "test/unit"
require "net/http"

class IPV6OnWindowsTest < Test::Unit::TestCase

  def test_ipv6_connection
    http = Net::HTTP.new('w3.org', 80)
    response, result = http.get("/", nil)
    assert_not_nil result
  end

end

Помните, что при использовании идентичных установок Ruby 1.8.7 - также встречается с 1.8.6 и 1.9.1, кстати.

Есть ли кто-нибудь, кто может подсказать, что я могу здесь делать неправильно?

Поскольку эти две машины имеют много общих свойств, но одна проходит, а другая не проходит, мне трудно поверить в общепринятую мудрость, объясняющую это неспособностью Ruby обрабатывать IPv6 в Windows.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Что произойдет, если вместо 'w3.org' вы попытаетесь изменить его на 'http://w3.org'?Я слышал, что пропуск http может вызвать именно эту ошибку.

0 голосов
/ 13 июля 2010

Если доступ к w3.org не проходит тест, то это не может быть проблемой IPv6, так как w3.org еще не поддерживает IPv6. Доказательство:

$ host -t aaaa w3.org
w3.org has no AAAA record
$ host -t aaaa www.w3.org
www.w3.org has no AAAA record

Так что нет, Ruby на Windows не дает сбоя при работе с IPv6. Ну, может быть, вроде как, но и при работе с IPv4 это не помогает. Как вы сами сказали в комментариях, тест не пройден независимо от адреса. Если это так, то как это «проблема IPv6»? Неправильный диагноз, я подозреваю.

Вы сделали имя функции с именем test_ipv6_connection(), но все, что вы вызываете, это Net::HTTP.new() - вряд ли это функция, специфичная для IPv6. Я действительно озадачен тем, как здесь обвиняют IPv6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...