Что на самом деле означает InetAddress.isSiteLocalAddress ()? - PullRequest
11 голосов
/ 11 апреля 2011

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

 /**
 * 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 и устарел.

Ответы [ 5 ]

15 голосов
/ 11 апреля 2011

Метод определенно не устарел , и он определенно используется не только в IPv6.

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

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

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

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

1 голос
/ 11 апреля 2011

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

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

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

0 голосов
/ 24 июня 2015

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

  • ИМХО, 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

0 голосов
/ 15 апреля 2011

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

0 голосов
/ 11 апреля 2011

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

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

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

InetAddress даже имеет два прямых подкласса;

Inet4Address и Inet6Address

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

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

...