InetAddress.isSiteLocalAddress()实际上意味着什么?

时间:2011-04-11 09:32:47

标签: java network-programming inet

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

 /**
 * 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有关并且已被弃用。

5 个答案:

答案 0 :(得分:15)

该方法为definitely not deprecated,它绝对不仅仅用于IPv6。

在IPv4中有3 network address ranges that are defined for site-local addresses:10 / 8,172.16 / 12和192.168 / 16.

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

IPv6有类似的概念,这里的这些地址称为unqieu local addresses

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

答案 1 :(得分:1)

查看实施......

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

  • 恕我直言,Inet6Address.isSiteLocalAddress()没用。鉴于0xFEC0前缀已被RFC 3879描述为@tigz提及。我还没有看到任何设备(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通信。

  • 我的全球单播(这是公共IP的另一个名称)来自康卡斯特的2601::/20用于我的局域网通信。所以我想说这是正确的地址。

前缀表:www.iana.org

答案 4 :(得分:-1)

据我所知,不推荐使用isSiteLocalAddress方法。

isSiteLocalAddress - 说明

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

InetAddress甚至有两个直接子类;

Inet4AddressInet6Address

最好的办法是阅读JavaDocs。

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