15

下面是一些代码来确定应该在多宿主机上工作的本地主机名:

 /**
 * Work out the first local host name by iterating the network interfaces
 * 
 * @return
 * @throws SocketException
 */
private String findFirstLocalHostName() throws SocketException {

    Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();
    while (ifaces.hasMoreElements()) {
        NetworkInterface iface = ifaces.nextElement();
        Enumeration<InetAddress> addresses = iface.getInetAddresses();
        while (addresses.hasMoreElements()) {
            InetAddress add = addresses.nextElement();
            if (!add.isLoopbackAddress() && add.isSiteLocalAddress()) {
                return add.getHostName();
            }
        }
    }
    throw new RuntimeException("Failed to determine local hostname");
}

对 isSiteLocalAddress 的调用是否会引入错误?我找不到有关此方法的任何有用信息,但我感觉它仅与 IP v 6 相关并且已被弃用。

4

5 回答 5

23

该方法绝对不会被弃用,而且绝对不仅仅用于 IPv6。

在 IPv4 中,为站点本地地址定义了 3 个网络地址范围:10/8、172.16/12 和 192.168/16。

阅读Inet4Address.isSiteLocalAddress()表明,来自这 3 个网络的地址将true在这些方法上返回。

IPv6 也有类似的概念,这里将这些地址称为unqieu 本地地址

实际上,这会告诉您您拥有的地址是否绝对不是公共地址(请注意,即使此方法返回false,该地址可能仍然不是公共的)。

于 2011-04-11T09:38:33.370 回答
1

看执行...

对于Inet4Address,它会检查它是否是 RFC1918 “不可路由”地址之一:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。

对于 an Inet6Address,它会检查前两个八位字节以查看它是否是真正的“站点本地”地址。

于 2011-04-11T09:39:39.300 回答
0

'Site local' 是私有 IP 空间的弃用名称。(有些细微差别,但基本正确。)参见 RFC 1918。

于 2011-04-15T16:13:22.773 回答
0

我刚刚遇到了我认为类似的问题:试图确定我应该使用什么 IPv6 进行 LAN 通信

  • 恕我直言,Inet6Address.isSiteLocalAddress()没用。鉴于@tigz 提到的0xFEC0前缀已被RFC 3879弃用。我还没有看到任何设备(android、win、osx)实际上有一个0xFEC0(测试有限)

    //from java.net.Inet6Address (1.8.0_45) boolean isSiteLocalAddress() { return ((ipaddress[0] & 0xff) == 0xfe && (ipaddress[1] & 0xc0) == 0xc0); }

  • 0xFE80地址虽然不应该用于流量(根据我的理解和阅读(www.cisco.com))确实适用于与我的单个路由器(ping6,curl,http)的LAN通信。

  • 2601::/20我的来自 Comcast的 Global Unicast(这只是公共 IP 的另一个名称)用于我的 LAN 通信。所以我会说这是正确的地址。

前缀表:www.iana.org

于 2015-06-24T20:32:50.900 回答
-1

据我所知, isSiteLocalAddress 方法未被弃用。

isSiteLocalAddress - 说明

指示 InetAddress 是否为站点本地地址;如果地址不是站点本地单播地址,则为 false。

InetAddress 甚至有两个直接子类;

Inet4AddressInet6Address

最好的办法是阅读 JavaDocs。

您使用的是哪个版本的 JDK?

于 2011-04-11T09:40:20.360 回答