从 ruby Socket.ip_address_list 中识别所有相关的 ip 地址
Identify all relevant ip addresses from ruby Socket.ip_address_list
当使用 rubies Socket.ip_address_list 时,它将 return 一个 addr_info (https://ruby-doc.org/stdlib-2.0.0/libdoc/socket/rdoc/Addrinfo.html)
的数组
示例:
require 'socket'
addr_infos = Socket.ip_address_list
这个数组可以被所有定义的 ip_addresses 和属性如
迭代和列出
addr_infos.each do |addr_info|
puts "#{addr_info.ip_address}
#{addr_info.ipv4? ? 'ipv4? ' : ''}" +
"#{addr_info.ipv4_loopback? ? 'ipv4_loopback? ' : ''}" +
"#{addr_info.ipv4_private? ? 'ipv4_private? ' : ''}" +
"#{addr_info.ipv4_multicast? ? 'ipv4_multicast? ' : ''}" +
"#{addr_info.ipv6? ? 'ipv6? ' : '' }" +
"#{addr_info.ipv6_loopback? ? 'ipv6_loopback? ' : ''}" +
"#{addr_info.ipv6_linklocal? ? 'ipv6_linklocal? ' : ''}" +
"#{addr_info.ipv6_multicast? ? 'ipv6_multicast? ' : ''}" +
"#{addr_info.ipv6_sitelocal? ? 'ipv6_sitelocal? ' : ''}" +
"#{addr_info.ipv6_unique_local? ? 'ipv6_unique_local? ' : ''}" +
"#{addr_info.ipv6_mc_global? ? 'ipv6_mc_global? ' : ''}" +
"#{addr_info.ipv6_unspecified? ? 'ipv6_unspecified? ' : ''}"
end
结果会像
127.0.0.1
ipv4? ipv4_loopback?
192.168.178.33
ipv4? ipv4_private?
1.2.4.5
ipv4?
::1
ipv6? ipv6_loopback?
fe80::1%lo0
ipv6? ipv6_linklocal?
fe80::aede:48ff:fe00:1122%en5
ipv6? ipv6_linklocal?
fe80::68:e785:4cfb:41e6%en0
ipv6? ipv6_linklocal?
fe80::50fc:46ff:fe4c:c2b4%awdl0
ipv6? ipv6_linklocal?
fe80::3203:d609:ff08:151d%utun0
ipv6? ipv6_linklocal?
fd00::ffff:aaaa:bbbb:7005
ipv6? ipv6_unique_local?
2003:ffff:4723:aaaa:bbbb:8888:269a:42a4
ipv6?
问:如何识别 "correct" 绑定监听服务的 ip 地址?
恕我直言,识别 IPv4 地址很容易,例如:
IPv4 = ipv4? && (ipv4_loopback? || ipv4_private? || !(ipv4_loopback? || ipv4_private? || ipv4_multicast?))
但是万一那么多ipv6_呢?属性 我想知道要检查什么来识别 IPv6 地址。
这是正确的建议吗?
在以下情况下是 IPv6 地址:
一个。 IPv6?是真的,没有其他 ipv6_...?属性为真
b. IPv6? ipv6_loopback?是真的
C。 IPv6? ipv6_unique_local 为真
我是否遗漏了 IPv6 地址中的某些内容?
除了这个问题,这是我目前的解决方案。也许有些人可能会添加评论或投票以确保这是正确的方向
ip_addresses_for_host = []
Socket.ip_address_list.each do |a|
# test for all local valid ipv4 and ipv6 ip_addresses
# check question on Whosebug for details
#
ip_addresses_for_host << a.ip_address if \
(a.ipv4? &&
(a.ipv4_loopback? || a.ipv4_private? ||
!(a.ipv4_loopback? || a.ipv4_private? || a.ipv4_multicast?)
)
) ||
(a.ipv6? &&
(a.ipv6_loopback? || a.ipv6_unique_local? ||
!(a.ipv6_loopback? || a.ipv6_unique_local? || a.ipv6_linklocal? || a.ipv6_multicast? || a.ipv6_sitelocal? ||
a.ipv6_mc_global? || a.ipv6_mc_linklocal? || a.ipv6_mc_nodelocal? || a.ipv6_mc_orglocal? || a.ipv6_mc_sitelocal? ||
a.ipv6_v4compat? || a.ipv6_v4mapped? || a.ipv6_unspecified?)
)
)
end
这将为 IPv4 解析:
一个。 127.0.0.1
b.私人地址,例如 192.168./16、10./8、...
C。其他 ipv4 地址,如 1.2.3.4
对于 IPv6:
一个。 ::1
b. fc00::
C。 abcd::
如果有人能补充更多知识,我们将不胜感激。
当使用 rubies Socket.ip_address_list 时,它将 return 一个 addr_info (https://ruby-doc.org/stdlib-2.0.0/libdoc/socket/rdoc/Addrinfo.html)
的数组示例:
require 'socket'
addr_infos = Socket.ip_address_list
这个数组可以被所有定义的 ip_addresses 和属性如
迭代和列出addr_infos.each do |addr_info|
puts "#{addr_info.ip_address}
#{addr_info.ipv4? ? 'ipv4? ' : ''}" +
"#{addr_info.ipv4_loopback? ? 'ipv4_loopback? ' : ''}" +
"#{addr_info.ipv4_private? ? 'ipv4_private? ' : ''}" +
"#{addr_info.ipv4_multicast? ? 'ipv4_multicast? ' : ''}" +
"#{addr_info.ipv6? ? 'ipv6? ' : '' }" +
"#{addr_info.ipv6_loopback? ? 'ipv6_loopback? ' : ''}" +
"#{addr_info.ipv6_linklocal? ? 'ipv6_linklocal? ' : ''}" +
"#{addr_info.ipv6_multicast? ? 'ipv6_multicast? ' : ''}" +
"#{addr_info.ipv6_sitelocal? ? 'ipv6_sitelocal? ' : ''}" +
"#{addr_info.ipv6_unique_local? ? 'ipv6_unique_local? ' : ''}" +
"#{addr_info.ipv6_mc_global? ? 'ipv6_mc_global? ' : ''}" +
"#{addr_info.ipv6_unspecified? ? 'ipv6_unspecified? ' : ''}"
end
结果会像
127.0.0.1
ipv4? ipv4_loopback?
192.168.178.33
ipv4? ipv4_private?
1.2.4.5
ipv4?
::1
ipv6? ipv6_loopback?
fe80::1%lo0
ipv6? ipv6_linklocal?
fe80::aede:48ff:fe00:1122%en5
ipv6? ipv6_linklocal?
fe80::68:e785:4cfb:41e6%en0
ipv6? ipv6_linklocal?
fe80::50fc:46ff:fe4c:c2b4%awdl0
ipv6? ipv6_linklocal?
fe80::3203:d609:ff08:151d%utun0
ipv6? ipv6_linklocal?
fd00::ffff:aaaa:bbbb:7005
ipv6? ipv6_unique_local?
2003:ffff:4723:aaaa:bbbb:8888:269a:42a4
ipv6?
问:如何识别 "correct" 绑定监听服务的 ip 地址?
恕我直言,识别 IPv4 地址很容易,例如:
IPv4 = ipv4? && (ipv4_loopback? || ipv4_private? || !(ipv4_loopback? || ipv4_private? || ipv4_multicast?))
但是万一那么多ipv6_呢?属性 我想知道要检查什么来识别 IPv6 地址。
这是正确的建议吗?
在以下情况下是 IPv6 地址:
一个。 IPv6?是真的,没有其他 ipv6_...?属性为真
b. IPv6? ipv6_loopback?是真的
C。 IPv6? ipv6_unique_local 为真
我是否遗漏了 IPv6 地址中的某些内容?
除了这个问题,这是我目前的解决方案。也许有些人可能会添加评论或投票以确保这是正确的方向
ip_addresses_for_host = []
Socket.ip_address_list.each do |a|
# test for all local valid ipv4 and ipv6 ip_addresses
# check question on Whosebug for details
#
ip_addresses_for_host << a.ip_address if \
(a.ipv4? &&
(a.ipv4_loopback? || a.ipv4_private? ||
!(a.ipv4_loopback? || a.ipv4_private? || a.ipv4_multicast?)
)
) ||
(a.ipv6? &&
(a.ipv6_loopback? || a.ipv6_unique_local? ||
!(a.ipv6_loopback? || a.ipv6_unique_local? || a.ipv6_linklocal? || a.ipv6_multicast? || a.ipv6_sitelocal? ||
a.ipv6_mc_global? || a.ipv6_mc_linklocal? || a.ipv6_mc_nodelocal? || a.ipv6_mc_orglocal? || a.ipv6_mc_sitelocal? ||
a.ipv6_v4compat? || a.ipv6_v4mapped? || a.ipv6_unspecified?)
)
)
end
这将为 IPv4 解析:
一个。 127.0.0.1
b.私人地址,例如 192.168./16、10./8、...
C。其他 ipv4 地址,如 1.2.3.4
对于 IPv6:
一个。 ::1
b. fc00::
C。 abcd::
如果有人能补充更多知识,我们将不胜感激。