gpt4 book ai didi

java - 当主机名是 64 个字符时,InetAddress.getLocalHost() 返回错误结果

转载 作者:IT王子 更新时间:2023-10-29 00:36:54 25 4
gpt4 key购买 nike

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

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

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

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

感谢您的帮助!

最佳答案

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

为了获得正确的地址/主机名,您可以使用以下代码,它将列出与网络接口(interface)关联的所有 IP 地址(在我的示例中为 eth0),并且我们'我们将选择不属于环回类的 IPv4。

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

instead of NetworkInterface.getByName("eth0") I suggest to iterate over NetworkInterface.getNetworkInterfaces()

关于java - 当主机名是 64 个字符时,InetAddress.getLocalHost() 返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4871451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com