2011-02-02 4 views
5

estoy usando código de abajo para imprimir el nombre de host de un sistema Linux usando java 1,5InetAddress.getLocalHost() devuelve un resultado erróneo cuando el nombre de host es de 64 caracteres

public static void main(String a[]) { 
    System.out.println(InetAddress.getLocalHost().getCanonicalHostName()); 
} 

Cuando tengo nombre de host del sistema de una longitud de 64 Char cadena, el código solo imprime 'localhost.localdomain'. Si la longitud de mi nombre de host es menor que 64, imprime el nombre de host correctamente. La longitud máxima del nombre de host para el sistema es 64 (getconf HOST_NAME_MAX da 64)

¿Qué podría estar mal aquí? Podría ser un error (aunque me inclino a pensar que el problema está de mi lado)

¡Gracias por la ayuda!

+0

ACTUALIZACIÓN: He archivado esto como un error con bugs.sun.com. link: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7024560 – Nishan

+1

ACTUALIZACIÓN: Este problema se ha corregido en JDK 7. – Nishan

Respuesta

0

Es difícil adivinar qué podría estar yendo mal en su caso, pero basado en el corresponding code from Java 6, podría ser tan simple como un problema de resolución de nombre, o posiblemente Java falsamente pensando que su nombre de host de 64 caracteres está falsificado.

+0

Creo que el problema es con Inet4AddressImpl.getLocalHostName() que es un método nativo . Todavía tengo que verificar esto, lo mantendré informado. – Nishan

3

Lo que puede suceder en Linux es que InetAddress.getLocalHost() devolverá la dirección de bucle invertido (en 127/8, generalmente 127.0.0.1). Por lo tanto, es probable que el nombre tomado del archivo /etc/hosts sea localhost.localdomain.

Para obtener la dirección/nombre de host correctos, puede usar el siguiente código, que listará todas las direcciones IP asociadas con una interfaz de red (eth0 en mi ejemplo), y seleccionaremos el IPv4, eso no pertenece a la clase loopback.

try { 
    // Replace eth0 with your interface name 
    NetworkInterface i = NetworkInterface.getByName("eth0"); 

    if (i != null) { 

     Enumeration<InetAddress> iplist = i.getInetAddresses(); 

     InetAddress addr = null; 

     while (iplist.hasMoreElements()) { 
      InetAddress ad = iplist.nextElement(); 
      byte bs[] = ad.getAddress(); 
      if (bs.length == 4 && bs[0] != 127) { 
       addr = ad; 
       // You could also display the host name here, to 
       // see the whole list, and remove the break. 
       break; 
      } 
     } 

     if (addr != null) { 
      System.out.println(addr.getCanonicalHostName()); 
     } 
    } catch (...) { ... } 

Puede cambiar un poco el código para mostrar todas las direcciones, ver los comentarios dentro del código.

edición

Es posible que desee también para iterar sobre otras tarjetas de red, según lo sugerido por @rafalmag

en lugar de NetworkInterface.getByName ("eth0") Sugiero a iterar sobre NetworkInterface.getNetworkInterfaces()

+0

Sí, esto funciona. Pero todavía me gustaría saber qué está mal con mi código, o qué está mal con la JVM. Creo que seguiré buscando. – Nishan

+1

@Nishan No creo que el problema esté relacionado con 64 caracteres. En Linux, 'getLocalHost()' devuelve el loopback. A menos que cambie el '/ etc/hosts' obtendrá el' localhost.localdomain'. No es un error (el mismo comportamiento en mi propio servidor; también uso el código anterior). –

+0

Oh sí, tengo una entrada válida en/etc/hosts. Mi archivo/etc/hosts se ve así: '127.0.0.1 localhost.localdomain 192.168.1.2 <64_char_hostname>' – Nishan

Cuestiones relacionadas