InetAddress.getLocalHost () возвращает неверный результат, когда имя хоста составляет 64 символа - PullRequest
5 голосов
/ 02 февраля 2011

Я использую приведенный ниже код для распечатки имени хоста linux box, используя java 1.5

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

Когда у меня есть имя хоста системы длиной 64 символа, код просто печатает 'localhost.localdomain',Если длина моего имени хоста меньше 64, он правильно выводит имя хоста.Максимальная длина имени хоста для системы составляет 64 (getconf HOST_NAME_MAX дает 64)

Что здесь может быть не так?Может ли это быть ошибкой (хотя я склонен думать, что проблема на моей стороне)

Спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 02 февраля 2011

Что может случиться в Linux, так это то, что InetAddress.getLocalHost() вернет адрес обратной связи (в 127/8, обычно 127.0.0.1). Таким образом, имя, взятое из файла /etc/hosts, вероятно, будет localhost.localdomain.

Чтобы получить правильный адрес / имя хоста, вместо этого вы можете использовать следующий код, который перечислит все IP-адреса, связанные с сетевым интерфейсом (eth0 в моем примере), и мы выберем один IPv4 , который не принадлежит классу 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 (...) { ... }

Вы можете немного изменить код для отображения всех адресов, см. Комментарии внутри кода.

редактировать

Возможно, вы захотите перебрать и другие сетевые карты, как предлагает @ rafalmag

вместо NetworkInterface.getByName ("eth0") я предлагаю перебрать NetworkInterface.getNetworkInterfaces ()

0 голосов
/ 02 февраля 2011

Трудно догадаться, что может пойти не так в вашем случае, но, основываясь на соответствующем коде из Java 6 , это может быть так же просто, как проблема с разрешением имен, или, возможно, Java ошибочно полагает, что ваш 64-символьное имя хоста подделано.

...