Что означает 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 вы используете?