Что означает InetAddress.isSiteLocalAddress()?

Вот некоторый код для определения имени локального хоста, которое должно работать в многоосевом поле:

 /**
 * Work out the first local host name by iterating the network interfaces
 * 
 * @return
 * @throws SocketException
 */
private String findFirstLocalHostName() throws SocketException {

    Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();
    while (ifaces.hasMoreElements()) {
        NetworkInterface iface = ifaces.nextElement();
        Enumeration<InetAddress> addresses = iface.getInetAddresses();
        while (addresses.hasMoreElements()) {
            InetAddress add = addresses.nextElement();
            if (!add.isLoopbackAddress() && add.isSiteLocalAddress()) {
                return add.getHostName();
            }
        }
    }
    throw new RuntimeException("Failed to determine local hostname");
}

Входит ли вызов isSiteLocalAddress в ошибку? Я не могу найти полезную информацию об этом методе, но у меня есть ощущение, что оно относится только к IP v 6 и не рекомендуется.

Ответ 1

Этот метод определенно не является устаревшим и определенно используется не только в IPv6.

В IPv4 есть 3 диапазона сетевых адресов, которые определены для локальных адресов сайта: 10/8, 172.16/12 и 192.168/16.

Чтение Inet4Address.isSiteLocalAddress() показывает, что адреса именно из этих трех сетей вернут true в этих методах.

IPv6 имеет аналогичную концепцию, здесь эти адреса называются unqieu локальными адресами.

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

Ответ 2

Глядя на реализацию...

Для Inet4Address он проверяет, является ли он одним из "неперехваченных" адресов RFC1918: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16.

Для Inet6Address он проверяет первые два октета, чтобы увидеть, является ли он реальным локальным адресом сайта.

Ответ 3

"Локальный сайт" - это устаревшее имя для частного IP-пространства. (Некоторые нюансы, но в основном правильные.) См. RFC 1918.

Ответ 4

Я просто столкнулся с тем, что, по моему мнению, является аналогичной проблемой: пытаясь определить, какой IPv6 я должен использовать для объединения LAN:

  • ИМХО, Inet6Address.isSiteLocalAddress() бесполезно. Учитывая, что префикс 0xFEC0 был лишен RFC 3879, как упоминалось в @tigz. Я еще не видел, чтобы какое-либо устройство (android, win, osx) на самом деле имело 0xFEC0 (с ограниченным тестированием)

    //from java.net.Inet6Address (1.8.0_45) boolean isSiteLocalAddress() { return ((ipaddress[0] & 0xff) == 0xfe && (ipaddress[1] & 0xc0) == 0xc0); }

  • 0xFE80, хотя и не предполагается использовать для трафика (из моего понимания и чтения (www.cisco.com)) для локальной связи с моим единственным маршрутизатором (ping6, curl, http).

  • My Global Unicast (это просто другое имя для публичного IP-адреса) 2601::/20 от Comcast работал для моей локальной сети. Поэтому я бы сказал, что это правильный адрес для использования.

Таблица префиксов: www.iana.org

Ответ 5

Насколько я знаю, метод isSiteLocalAddress не устарел.

isSiteLocalAddress - Объяснение

указывает, является ли InetAddress локальным адресом сайта; или false, если адрес не является локальным адресом одноадресной рассылки.

В InetAddress есть два прямых подкласса:

Inet4Address и Inet6Address

Лучше всего читать JavaDocs.

Какую версию JDK вы используете?