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

Java InetAddress.isSiteLocalAddress()实际上是什么意思?,java,network-programming,inet,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<NetworkInt

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

 /**
 * 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");
}
/**
*通过迭代网络接口计算出第一个本地主机名
* 
*@返回
*@SocketException
*/
私有字符串findFirstLocalHostName()引发SocketException{
枚举ifaces=NetworkInterface.getNetworkInterfaces();
while(ifaces.hasMoreElements()){
网络接口iface=ifaces.nextElement();
枚举地址=iface.getInetAddresses();
while(addresses.hasMoreElements()){
InetAddress add=addresses.nextElement();
如果(!add.isLoopbackAddress()&&add.isSiteLocalAddress()){
返回add.getHostName();
}
}
}
抛出新的RuntimeException(“无法确定本地主机名”);
}
调用isSiteLocalAddress是否会引入错误?我找不到有关此方法的任何有用信息,但我感觉它仅与IP v 6相关,并且已被弃用。

此方法是,而且肯定不仅仅用于IPv6

IPv4中有:10/8、172.16/12和192.168/16

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

IPv6有一个类似的概念,这里这些地址被称为


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

查看实现

对于
Inet4Address
,它会检查它是否是RFC1918“不可路由”地址之一:10.0.0.0/8172.16.0.0/12192.168.0/16


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

据我所知,isSiteLocalAddress方法没有被弃用

isSiteLocalAddress-解释

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

InetAddress甚至有两个直接子类

最好的办法是阅读JavaDocs


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

'Site local'是一个不推荐使用的专用IP空间名称。(有些细微差别,但基本上是正确的。)参见RFC1918。

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

  • 总之,
    Inet6Address.isSiteLocalAddress()
    是无用的。假定
    0xFEC0
    前缀已被@tigz所述的方法去除。我还没有看到任何设备(安卓、win、osx)真正有
    0xFEC0
    (测试有限)

    //来自java.net.Inet6Address(1.8.0_45)
    布尔Isistelocaladdress(){
    返回((ipaddress[0]&0xff)==0xfe
    &&(IP地址[1]&0xc0)==0xc0);
    }

  • 0xFE80
    地址虽然不应该用于通信(从我的理解和阅读()),但在与我的单个路由器(ping6、curl、http)进行局域网通信时起作用

  • 我的全球单播(这只是公共IP的另一个名称)由康卡斯特为我的局域网通信工作。所以我想说这是正确的地址


前缀表:

请参阅。如果地址是IPv6站点本地地址,则返回true。@约翰:是的,我知道IPv6中也有类似的含义,但我不知道它的具体含义。但由于这个问题暗示它只是IPv6,我想澄清这一点。(顺便说一句,我看不到你链接到的页面)。为了清楚起见,我并不是说这个方法被弃用了。。。仅仅是IPv6中“站点本地”地址的概念