我有一个存储主机名的Ruby数组 server_names 。如果我打印出来,它看起来像这样:
["hostname.abc.com", "hostname2.abc.com", "hostname3.abc.com"]
非常标准。我尝试做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。
看起来IPSocket类可能会这样做,但我不确定如何使用IPSocket类迭代它。如果它只是尝试打印出如下的IP:
server_names.each do |name|
IPSocket::getaddress(name)
p name
end
它抱怨说我没有提供服务器名称。这是一个语法问题还是我没有正确使用该类?
输出:
getaddrinfo: nodename nor servname provided, or not known
答案 0 :(得分:5)
您可能最好使用Resolv,它是Ruby标准库的一部分,专门用于处理解析DNS条目。
来自Ruby文档:
Resolv是一个用Ruby编写的线程感知DNS解析器库。 Resolv可以同时处理多个DNS请求,而不会阻塞整个Ruby解释器。
示例:
require "resolv"
server_names.each do |name|
address = Resolv.getaddress(name)
puts address
end
答案 1 :(得分:3)
这就是getaddrinfo
方法的工作原理。如果可以解析名称,则会获得表示为字符串的IP地址。如果没有,您会收到SocketError
个例外。这意味着为了处理这些问题,您需要预测:
server_names.map do |name|
begin
IPSocket.getaddress(name)
rescue SocketError
false # Can return anything you want here
end
end
请注意,在调用方法时,使用.
而不是命名空间分隔符::
的约定。分隔符确实有效,但它通常用于引用MyClass::MY_CONST
之类的常量。