При использовании Rubies Socket.ip_address_list он вернет массив 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?
Q: Как определить «правильные» IP-адреса для привязки служб прослушивания to?
ИМХО, было бы легко идентифицировать адреса IPv4 как:
IPv4 = ipv4? && (ipv4_loopback? || ipv4_private? || !(ipv4_loopback? || ipv4_private? || ipv4_multicast?))
Но в случае этих многих ipv6_? Атрибуты Интересно, что нужно проверить для определения адресов IPv6.
Это правильное предложение?
Это адрес IPv6, когда:
a. ipv6? это правда а другой ipv6 _... нет? атрибут истинный
б. ipv6? и ipv6_loopback? верны
c. ipv6? и ipv6_unique_local имеют значение true
Я что-то пропускаю по адресам IPv6?