Почему класс Java InetAddress не разрешает адреса ipv6 в их полное доменное имя? - PullRequest
6 голосов
/ 04 января 2011

Я пытаюсь написать простую программу с использованием 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, вместо IP-адреса, произойдет исключение.

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

Ответы [ 4 ]

2 голосов
/ 17 ноября 2015

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

-Dsun.net.spi.nameservice.provider.1 = DNS, вс

или

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/

2 голосов
/ 05 января 2011

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

1 голос
/ 04 января 2011

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

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

0 голосов
/ 14 марта 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 статически инициализирует impls, от чего зависит результат метода isIPv6Supported () ??Моя установка Linux поддерживает ipv6, я могу выполнять поиск DNS для имен хостов ipv6, таких как ipv6.google.com.Буду признателен, если кто-нибудь может указать мне направление хорошей сетевой библиотеки в java для утилит ipv4 / v6, таких как lookup и т. Д.

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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...