【问题标题】:Is Ruby on Windows failing when dealing with IPv6?Windows 上的 Ruby 在处理 IPv6 时会失败吗?
【发布时间】: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


【解决方案1】:

如果您尝试将“w3.org”改为“http://w3.org”,会发生什么情况?我听说省略 http 会导致这个确切的错误。

【讨论】:

    【解决方案2】:

    如果访问 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
    

    所以不,Windows 上的 Ruby 在处理 IPv6 时并没有失败。好吧,也许有点,但在处理 IPv4 时它也失败了。正如您在 cmets 中所说的那样,无论地址如何,测试都会失败。如果是这样,这怎么算“IPv6 问题”?我怀疑是误诊。

    您创建了一个名为 test_ipv6_connection() 的函数名称,但您调用的只是 Net::HTTP.new() — 几乎不是 IPv6 特定的函数。对于 IPv6 是如何在这里受到指责的,我真的很困惑。

    【讨论】:

    • 我和你一样难过,但这似乎是任何人都可以提供的唯一解释(但是,虽然在这种情况下端点不是启用 IPv6,但我所在的网络是) .虽然同样,它只发生在 Windows Server 2008 R2 上,而不是在同一网络内的各种支持 IPv6 的 Windows 7 机器上。
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2021-08-25
    • 2010-12-19
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多