InetAddress.isSiteLocalAddress() 实际上是什么意思?

2022-09-03 05:40:51

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

 /**
 * 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 的调用是否引入了 bug?我找不到有关此方法的任何有用信息,但我有一种感觉,它仅与IP v 6相关,并且已被弃用。


答案 1

该方法绝对没有被弃用,它绝对不仅仅用于IPv6。

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

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

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

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


答案 2

查看实现...

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

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


推荐