Сервер обычно имеет более одного интерфейса, по крайней мере, один закрытый и один общедоступный.
Поскольку все ответы здесь касаются этого простого сценария, более простой способ - запросить у Socket текущий ip_address_list()
как в:
require 'socket'
def my_first_private_ipv4
Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
end
def my_first_public_ipv4
Socket.ip_address_list.detect{|intf| intf.ipv4? and !intf.ipv4_loopback? and !intf.ipv4_multicast? and !intf.ipv4_private?}
end
Оба возвращают объект Addrinfo
, поэтому, если вам нужна строка, вы можете использовать метод ip_address()
, как в:
ip= my_first_public_ipv4.ip_address unless my_first_public_ipv4.nil?
Вы можете легкоразработайте более подходящее решение для вашего случая, изменив методы Addrinfo, используемые для фильтрации требуемого адреса интерфейса.