2011-01-03 7 views
6

Sto provando a scrivere un semplice programma utilizzando Java che, dato un IP in formato 4 o 6, restituirà il suo FQDN. Il seguente codice funziona correttamente quando viene fornito un indirizzo IPv4, ma restituirà solo l'indirizzo specificato quando viene immesso un indirizzo IPv6.Perché la classe InetAddress di Java non risolve gli indirizzi IPv6 nel loro 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();); 

Ogni volta che entro in un getHostName ipv6() restituirà solo la stessa ipv6, anche quando so che l'ipv6 si risolve in un nome di dominio completo. Inoltre, se inserisco un nome host ipv6, come ipv6.google.com, al posto di IpAddress, si verificherà l'eccezione.

Sono nuovo di questa roba quindi apprezzerei qualsiasi tipo di assistenza. Grazie.

+1

Il tuo host/rete ha sicuramente il DNS IPv6 in funzione? Nslookup ottiene il risultato giusto? –

+0

Sì. nslookup funziona bene. – user561877

risposta

1

Provare inet.getCanonicalHostName(); quale "Ottiene il nome di dominio completo per questo indirizzo IP".

Se si costruisce il InetAddress utilizzando InetAddress.getByName(), getHostName() restituirà ciò con cui è stato creato. getCanonicalHostName() impone la ricerca del nome inverso.

+0

In realtà l'avevo già provato ma senza successo. Ancora lo stesso problema. – user561877

2

Il problema era in realtà la versione di Java che stavo correndo. L'aggiornamento di Java alla versione 1.6.23, dalla versione 1.6.21, consentiva agli ipv6 di risolvere il loro FQDN.

+2

Potrebbe essere necessario contrassegnare la propria risposta come "la risposta". Fai clic sul segno di spunta accanto ad esso (diventa verde). –

0

Uso java.net.InetAddress non è possibile avere IPv6 e la risoluzione del nome ipv4 ecc Il grappolo di metodi statici, come getByName ecc delegare la ricerca di istanza di Inet4 (o 6) AddressImpl che fa

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

Ora il divertimento è a) tutti questi sono privati ​​/ pacchetti locali quindi non c'è modo di iniettare le classi impl alla classe InetAddress b) Inet4 (o 6) Le classi AddressImpl sono a loro volta package local. Quindi non c'è modo di dire, fare una risoluzione di ricerca/nome ipv4 o ipv6 al volo. Non ho il modo in cui tutti i punti di estensione sono stati bloccati per queste classi rendendoli di uso e flessibilità davvero molto limitati. La vera magia nera avviene qui, dove la classe InetAddress inizializza staticamente l'impls, su cosa dipende il risultato del metodo IPv6Supported() ?? Il mio setup Linux supporta ipv6, posso fare ricerche dns per i nomi host ipv6 come ipv6.google.com. apprezzeranno se qualcuno mi può puntare alla direzione di una buona biblioteca netta in java per IPv4/v6 utilità come ricerca ecc

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

Ho fatto un rapido un'indagine di quello che sta succedendo con hostname < -> risoluzione ipv6 in java 8, Windows 7. Sembra che "default" NameService non funzioni affatto con ipv6! Ma! Java viene fornito con un'altra implementazione NameService basata su JNDI chiamata "dns, sun". Quindi, se lo si attiva utilizzando

-Dsun.net.spi.nameservice.provider.1 = dns, sole

o

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

otterrete ip < bidirezionale - risoluzione> hostname per gli indirizzi v4 e v6 come questo

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

Maggiori informazioni su ipv6 java è possibile trova qui http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/

Problemi correlati