2011-04-11 827 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