当hostname为64个字符时,InetAddress.getLocalHost()返回错误的结果

时间:2011-02-02 06:35:10

标签: java linux hostname

我使用下面的代码使用java 1.5打印出linux盒子的主机名

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

当我有一个64字符长字符串的系统主机名时,代码只打印'localhost.localdomain'。如果我的主机名长度小于64,则会正确打印出主机名。系统的最大主机名长度为64(getconf HOST_NAME_MAX为64)

这里有什么问题?这可能是一个错误(但我倾向于认为问题在我身边)

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

Linux上可能发生的是InetAddress.getLocalHost()将返回环回地址(在127/8中,通常为127.0.0.1)。因此,/etc/hosts文件中的名称可能是localhost.localdomain

为了获得正确的地址/主机名,您可以使用以下代码,它将列出与网络接口关联的所有IP地址(在我的示例中为eth0),我们将选择IPv4 one,不属于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

的建议迭代其他NIC
  

而不是NetworkInterface.getByName(“eth0”)我建议迭代一下NetworkInterface.getNetworkInterfaces()

答案 1 :(得分:0)

很难猜出你的情况可能会出现什么问题,但基于corresponding code from Java 6,它可能就像名称解析问题一样简单,或者可能是Java错误地认为你的64个字符的主机名是欺骗性的。