2011-04-11 145 views
9

下面是一些代码,以确定应该在多宿主箱工作本地主机名:InetAddress.isSiteLocalAddress()实际上是什么意思?

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

+0

为清楚起见,我不是这个意思,该方法已被否决......的“本地站点”,在IPv6和每http地址只是概念://www.ietf .org/rfc/rfc3879.txt – TiGz 2011-04-11 10:23:36

回答

13

该方法是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

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

+2

see [here](http://books.google.co.in/books?id=NyxObrhTv5oC&lpg=PT187&dq=InetAddress.isSiteLocalAddress()&pg = PT186#v = onepage&q&f = false)。如果地址是IPv6站点本地地址,则返回true。 – 2011-04-11 09:43:14

+0

@John:是的,我知道在IPv6中也有类似的含义,但我不知道它的具体含义。但是由于这个问题暗示它只是IPv6,我想澄清这一点。 (顺便说一下,我无法阅读你链接的页面)。 – 2011-04-11 09:46:01

1

望着实现...

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

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

-1

据我所知isSiteLocalAddress方法不被弃用。

isSiteLocalAddress - 说明

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

InetAddress甚至有两个直接的子类;

Inet4AddressInet6Address

最好的办法是阅读的JavaDoc。

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

0

'Site local'是专用IP空间的不推荐名称。 (一些细微的,但基本上是正确的。)请参见RFC 1918

0

我只是碰到了我认为是一个类似的问题就来了:试图确定IPv6的,我应该使用什么LAN comuncation

  • 恕我直言,Inet6Address.isSiteLocalAddress()是无用的。考虑到0xFEC0前缀已被RFC 3879描述为@tigz所提及的。我还没有看到任何设备(机器人,赢,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)的局域网通信起作用。

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

前缀表:www.iana.org