【发布时间】:2010-07-12 09:51:54
【问题描述】:
所以我有一个使用 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'
...
谷歌搜索表明这可能是 Ruby 在 Windows 机器上处理 IPv6 时失败的问题。 但是:它在这台启用了完整 IPv6 堆栈的 Windows 7 机器上运行良好,连接到同一个网络并且甚至安装了与 2K8 完全相同的 Ruby服务器失败并显示该错误消息。
以下是在 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 无法在 Windows 上处理 IPv6 的传统观点。
提前致谢!
【问题讨论】:
-
澄清:我的示例测试用例('w3.org')中使用的地址是任意的,无论目标如何,都会失败。
-
我也面临同样的问题!来自同一台机器的 curl 请求工作正常,但 net http get 因此错误而失败。知道为什么会发生这种情况吗?
标签: windows ruby http sockets ipv6