以下是一些代码,用于确定应该在多宿主框上工作的本地主机名:
/**
* 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 :(得分: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甚至有两个直接子类;
最好的办法是阅读JavaDocs。
您使用的是哪个版本的JDK?