2011-01-03 15 views
6

Ich versuche, ein einfaches Programm zu schreiben, das Java verwendet, das bei einer IP im Format der Version 4 oder 6 seinen FQDN zurückgibt. Der folgende Code funktioniert einwandfrei, wenn eine IPv4-Adresse angegeben wird, gibt jedoch nur die angegebene Adresse zurück, wenn eine IPv6-Adresse eingegeben wird.Warum löst die InetAddress-Klasse von Java nicht ipv6-Adressen in ihrem FQDN auf?

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();); 

Jedes Mal, wenn ich ein ipv6 getHostName eingeben() wird nur die gleiche ipv6 zurückkehren, auch wenn ich weiß, dass die ipv6 zu einem FQDN lösen wird. Wenn ich einen IPv6-Hostnamen wie ipv6.google.com anstelle der IP-Adresse eingeben, tritt die Ausnahme auf.

Ich bin neu in diesem Zeug, so würde jede Hilfe zu schätzen wissen. Vielen Dank.

+1

Hat Ihr Host/Netzwerk definitiv IPv6 DNS funktioniert? Hat nslookup das richtige Ergebnis? –

+0

Ja. nslookup funktioniert gut. – user561877

Antwort

1

Versuchen Sie inet.getCanonicalHostName();, die "den voll qualifizierten Domänennamen für diese IP-Adresse erhält."

Wenn Sie die InetAddress mit InetAddress.getByName() erstellen, gibt getHostName() zurück, woran Sie sie erstellt haben. getCanonicalHostName() erzwingt eine umgekehrte Namenssuche.

+0

Das hatte ich eigentlich schon ausprobiert, aber ohne Erfolg. Immer noch das gleiche Problem. – user561877

2

Das Problem war eigentlich die Version von Java, die ich lief. Die Aktualisierung von Java auf 1.6.23 von 1.6.21 erlaubte es ipv6s, auf ihren FQDN aufzulösen.

+2

Sie können Ihre eigene Antwort als "die Antwort" markieren. Klicken Sie auf das Häkchen daneben (grün). –

0

java.net.InetAddress Verwendung nicht möglich ist, IPv6- und IPv4-Namensauflösung usw. Die Reihe von statischen Methoden wie getByName haben usw. die Lookup-Instanz von inet4 delegieren (oder 6) AddressImpl die

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

Jetzt ist der Spaß a) all diese sind privat/Paket lokal, so gibt es keine Möglichkeit, die Impl-Klassen der InetAddress-Klasse injizieren b) Inet4 (oder 6) AddressImpl-Klassen sind selbst Paket lokal. Also gibt es keine Möglichkeit zu sagen, eine ipv4 oder IPv6 Lookup/Namensauflösung im laufenden Betrieb. Ich bekomme nicht die Art und Weise, wie alle Erweiterungspunkte für diese Klassen blockiert wurden, wodurch sie wirklich sehr eingeschränkt nutzbar und flexibel sind. Die echte Schwarzmagie passiert hier, wo die InetAddress-Klasse die Impls statisch initialisiert, was bewirkt das Ergebnis der Methode isIPv6Supported()? Mein Linux-Setup unterstützt ipv6, ich kann DNS-Lookups für IPv6-Hostnamen wie ipv6.google.com durchführen. schätzen, wenn jemand mich in die Richtung einer guten Netto-Bibliothek in Java für IPv4/v6 Dienstprogramme wie Lookup usw. zeigen kann

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

ich eine schnelle Untersuchung gemacht habe, was mit dem Hostnamen los ist < -> IPv6-Auflösung in Java 8, Windows 7. Sieht aus wie 'Standard' NameService funktioniert überhaupt nicht mit IPv6! Aber! Java kommt mit einer anderen JNDI-basierten NameService-Implementierung namens 'dns, sun'. Also, wenn Sie ermöglichen es entweder

-Dsun.net.spi.nameservice.provider verwenden.> Namensauflösung für v4 und v6-Adressen wie diese

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

Mehr Infos über java ipv6 Sie können - 1 = dns, Sonne

oder

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

werden Sie bidirektionale IP < erhalten finden Sie hier http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/