Определите все соответствующие IP-адреса из ruby Socket.ip_address_list - PullRequest
1 голос
/ 16 января 2020

При использовании 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?

1 Ответ

0 голосов
/ 17 января 2020

Это мое текущее решение в дополнение к этому вопросу. Возможно, некоторые могут добавить комментарий или проголосовать, чтобы убедиться, что это идет в правильном направлении

Это разрешит для IPv4:

a. 127.0.0.1
б. частные адреса, такие как 192.168./16, 10./8, ...
c. другие адреса ipv4, такие как 1.2.3.4

и для IPv6:

a. :: 1
б. fc00 ::
c. abcd ::

Цените, если кто-то добавил бы больше знаний.

...