Итак, у меня есть инструмент, который я встроил в 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.
Заранее спасибо!