我遇到连接数据库的ruby应用程序的问题。经过几个小时的探索,我的问题归结为Socket.getaddrinfo 'localhost', nil
返回意外地址:
ruby -e "require \"socket\"; puts Socket.getaddrinfo('localhost', nil).inspect"
[["AF_INET", nil, "10.10.1.37", "10.10.1.37", 2, 2, 17],
["AF_INET", nil, "10.10.1.37", "10.10.1.37", 2, 1, 6],
["AF_INET", nil, "fe80:0:0:0:5e96:9dff:fe94:fce3%5", "fe80:0:0:0:5e96:9dff:fe94:fce3%5", 2, 2, 17],
["AF_INET", nil, "fe80:0:0:0:5e96:9dff:fe94:fce3%5", "fe80:0:0:0:5e96:9dff:fe94:fce3%5", 2, 1, 6]]
10.10.1.37是网络适配器的地址。
我正在使用rvm,当我使用jruby时,这种奇怪的行为就会发生。如果我使用普通的ruby版本,结果就是我所期望的(例如'127.0.0.1')。
根据wikipedia,localhost应该引用本地环回接口。什么可能导致这种行为,这是一个Java东西吗?
我试过的JRuby版本是:1.7.2,1.7.4和1.7.9
预期输出越多(使用常规ruby-1.9.3时):
ruby -e "require \"socket\"; puts Socket.getaddrinfo('localhost', nil).inspect"
[["AF_INET6", 0, "::1", "::1", 30, 2, 17],
["AF_INET6", 0, "::1", "::1", 30, 1, 6],
["AF_INET", 0, "127.0.0.1", "127.0.0.1", 2, 2, 17],
["AF_INET", 0, "127.0.0.1", "127.0.0.1", 2, 1, 6],
["AF_INET6", 0, "fe80::1%lo0", "fe80::1%lo0", 30, 2, 17],
["AF_INET6", 0, "fe80::1%lo0", "fe80::1%lo0", 30, 1, 6]]
答案 0 :(得分:1)
这看起来像jruby
中的错误。他们尽可能地保持与MRI的兼容性,并且当没有发生时,除非另有说明,否则它被认为是一个错误。您应该在Github
修改强>
我无法在运行jruby 1.7.10的Linux或使用1.7.8的OS X上重现这一点,但它对我来说似乎仍然是个错误。