2011-01-03 10 views
6

Estoy tratando de escribir un programa simple usando Java que, dado un IP en formato de versión 4 o 6, devolverá su FQDN. El siguiente código funciona bien cuando se le da una dirección IPv4, pero solo devolverá la dirección dada cuando se ingrese una dirección IPv6.¿Por qué la clase InetAddress de Java no resuelve direcciones IPv6 en su 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();); 

Cuando entro en el getHostName IPv6() sólo devolverá la misma IPv6, aun cuando sé que el IPv6 resolverá a un FQDN. Además, si ingreso un nombre de host ipv6, como ipv6.google.com, en lugar de theIpAddress, se producirá la excepción.

Soy nuevo en esta materia, por lo que agradecería cualquier ayuda. Gracias.

+1

¿Su host/red definitivamente tiene IPv6 DNS funcionando? ¿Nslookup obtiene el resultado correcto? –

+0

Sí. nslookup funciona bien. – user561877

Respuesta

1

Pruebe inet.getCanonicalHostName(); que "Obtiene el nombre de dominio completo para esta dirección IP."

Si construye el InetAddress usando InetAddress.getByName(), getHostName() devolverá con qué lo construyó. getCanonicalHostName() fuerza una búsqueda de nombre inversa.

+0

En realidad, ya lo había intentado pero no tuve éxito. Todavía el mismo problema. – user561877

2

El problema era en realidad la versión de Java que estaba ejecutando. La actualización de Java a 1.6.23, desde 1.6.21, permitió a los ipv6s resolver su FQDN.

+2

Es posible que desee marcar su propia respuesta como "la respuesta". Haga clic en la marca de verificación junto a él (ponlo verde). –

0

Usando java.net.InetAddress no es posible tener IPv6 y la resolución de nombres ipv4 etc. El racimo de métodos estáticos como getByName etc delegar la búsqueda a instancia de inet4 (o 6) AddressImpl que hace

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

Ahora la diversión es a) todos estos son privados/paquetes locales por lo que no hay forma de inyectar las clases impl a la clase InetAddress b) Inet4 (o 6) Las clases AddressImpl son paquetes locales. Por lo tanto, no hay forma de decirlo, realice una búsqueda/nombre de resolución ipv4 o ipv6 sobre la marcha. No entiendo cómo se bloquearon todos los puntos de extensión para estas clases, lo que hace que su uso y flexibilidad sean muy limitados. La verdadera magia negra ocurre aquí, donde la clase InetAddress inicializa estáticamente las impls, ¿de qué depende el resultado del método? (Dependiente de IPv6()? Mi configuración de Linux admite ipv6, puedo hacer búsquedas DNS para nombres de host ipv6 como ipv6.google.com. podrá apreciar si alguien me puede apuntar a la dirección de una buena biblioteca neta en java para IPv4/v6 utilidades como las operaciones de búsqueda, etc.

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

que he hecho una investigación rápida de lo que está pasando con el nombre de host < -> resolución de ipv6 en java 8, Windows 7. Parece que 'por defecto' NameService no funciona con ipv6 en absoluto! ¡Pero! Java viene con otra implementación de NameService basada en JNDI llamada 'dns, sun'. Por lo tanto, si lo habilita utilizando

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

o

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

obtendrá ip < bidireccional -> Resolución de nombre de host para las direcciones v4 y v6 como esto

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

Más información sobre IPv6 Java Puede encuentre aquí http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/

Cuestiones relacionadas