2011-01-03 3 views
6

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

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, вместо theIpAddress, произойдет исключение.

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

+1

У вашего хоста/сети определенно работает IPv6 DNS? Получает ли nslookup правильный результат? –

+0

Да. nslookup отлично работает. – user561877

ответ

1

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

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

+0

Я действительно уже пробовал это, но безуспешно. Все та же проблема. – user561877

2

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

+2

Вы можете пометить свой собственный ответ как «ответ». Нажмите галочку рядом с ней (поверните ее зеленым цветом). –

0

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

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

Теперь забава: а) все это частные/пакетные локальные, поэтому не нужно вводить классы impl в класс InetAddress. B) Inet4 (или 6) классы AddressImpl сами являются локальными пакетами. Таким образом, нет никакого способа сказать, сделайте ipv4 или ipv6 lookup/name resolution на лету. Я не понимаю, как все блоки расширения были заблокированы для этих классов, что делает их очень ограниченным использованием и гибкостью. Настоящая черная магия происходит здесь, где класс 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(); 
} 
1

Я сделал быстрое исследование того, что происходит с именем хоста < -> Разрешение ipv6 в java 8, Windows 7. Похоже, что «по умолчанию» NameService не работает с ipv6 вообще! Но! Java поставляется с другой, основанной на JNDI версией NameService, называемой «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/