Почему класс Java InetAddress не разрешает адреса ipv6 в их полное доменное имя?

Я пытаюсь написать простую программу с использованием Java, которая, учитывая IP-адрес в формате версии 4 или 6, вернет свое полное доменное имя. Следующий код отлично работает, если указан адрес ipv4, но возвращает указанный адрес только при вводе адреса ipv6.

InetAddress inet;
try { inet = InetAddress.getByName(theIpAddress); }
catch(UnknownHostException e) { System.out.println("Unknown Host"); return; }

System.out.println(inet.getHostAddress(););
System.out.println(inet.getHostName(););

Всякий раз, когда я ввожу ipv6, getHostName() будет возвращать только тот же ipv6, даже если я знаю, что ipv6 будет разрешаться в полное доменное имя. Кроме того, если я введу имя хоста ipv6, например ipv6.google.com, вместо IpAddress, возникнет исключение.

Я новичок в этом деле, поэтому буду признателен за любую помощь. Спасибо.


person user561877    schedule 03.01.2011    source источник
comment
На вашем хосте/сети определенно работает IPv6 DNS? Получает ли nslookup правильный результат?   -  person nobody    schedule 04.01.2011


Ответы (4)


На самом деле проблема заключалась в версии Java, которую я использовал. Обновление Java до 1.6.23 с 1.6.21 позволило ipv6 разрешать их полное доменное имя.

person user561877    schedule 05.01.2011
comment
Вы можете пометить свой ответ как ответ. Нажмите на галочку рядом с ним (она станет зеленой). - person Matthijs Bierman; 17.10.2012

Я провел быстрое исследование того, что происходит с разрешением имени хоста ‹-> ipv6 в java 8, Windows 7. Похоже, служба NameService по умолчанию вообще не работает с ipv6! Но! Java поставляется с другой реализацией NameService на основе JNDI, которая называется «dns,sun». Итак, если вы включите его, используя либо

-Dsun.net.spi.nameservice.provider.1=dns,солнце

or

System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");

вы получите двунаправленный ip ‹-> разрешение имени хоста для адресов v4 и v6, как это

InetAddress.getAllByName(...)
address.getHostName()

Дополнительную информацию о java ipv6 вы можете найти здесь http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/

person Dmytro Voloshyn    schedule 17.11.2015

Попробуйте inet.getCanonicalHostName();, который «Получает полное доменное имя для этого IP-адреса».

Если вы создадите InetAddress, используя InetAddress.getByName(), getHostName() вернет то, с чем вы его построили. getCanonicalHostName() вызывает обратный поиск имени.

person robert_x44    schedule 03.01.2011
comment
На самом деле я уже пробовал это, но безуспешно. Все та же проблема. - person user561877; 04.01.2011

При использовании java.net.InetAddress невозможно иметь разрешение имен ipv6 и ipv4 и т. д. Набор статических методов, таких как getByName и т. д., делегирует поиск экземпляру Inet4(or 6)AddressImpl, который делает

public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException;

Теперь самое интересное: а) все они являются частными/локальными для пакета, поэтому нет способа внедрить классы impl в класс InetAddress; б) классы Inet4 (или 6)AddressImpl сами по себе являются локальными пакетами. Таким образом, нет способа сказать, выполняйте поиск/разрешение имени ipv4 или ipv6 на лету. Я не понимаю, как все точки расширения были заблокированы для этих классов, что делает их действительно очень ограниченными в использовании и гибкости. Настоящая черная магия происходит здесь, где класс InetAddress статически инициализирует импликации, от чего зависит результат метода isIPv6Supported()?? Моя установка Linux поддерживает ipv6, я могу выполнять поиск DNS для имен хостов ipv6, таких как ipv6.google.com. Буду признателен, если кто-нибудь укажет мне направление хорошей сетевой библиотеки в java для утилит ipv4/v6, таких как поиск и т. Д.

class InetAddressImplFactory {

    static InetAddressImpl create() {
    Object o;
    if (isIPv6Supported()) {
        o = InetAddress.loadImpl("Inet6AddressImpl");
    } else {
        o = InetAddress.loadImpl("Inet4AddressImpl");
    }
    return (InetAddressImpl)o;
    }

    static native boolean isIPv6Supported();
}
person redzedi    schedule 14.03.2011
comment
Это в основном неправильно. InetAddress вернет соответствующий класс реализации IPv4/6. Вот и вся причина дизайна. Это тоже не ответ. - person user207421; 13.03.2018