当我调用 methodNetworkInterface.getInetAddresses()
时,我得到以下字符串:
"fe80:0:0:0:f06c:31b8:cd17:5a44%5"
我想知道%5
这里是什么意思?如果没有这个,是否可以使用 IPv6 地址%5
?
当我调用 methodNetworkInterface.getInetAddresses()
时,我得到以下字符串:
"fe80:0:0:0:f06c:31b8:cd17:5a44%5"
我想知道%5
这里是什么意思?如果没有这个,是否可以使用 IPv6 地址%5
?
它在这里解释:
指定scope_id的一般格式如下:
*IPv6-address%scope_id*
IPv6 地址是如上所述的文字 IPv6 地址。scope_id指的是本地系统上的一个接口,它可以通过两种方式指定。
作为数字标识符。这必须是一个正整数,用于标识系统理解的特定接口和范围。通常,数值可以通过系统上的管理工具来确定。每个接口可能有多个值,每个范围一个。如果未指定范围,则使用的默认值为零。
作为一个字符串。这必须是NetworkInterface.getName()针对相关特定接口返回的确切字符串。以这种方式创建 Inet6Address 时,通过查询相关 NetworkInterface 在创建对象时确定数字范围 ID。
另请注意,数字scope_id可以从 NetworkInterface 类返回的 Inet6Address 实例中检索。这可用于找出系统上配置的当前范围 ID。
5 是区域索引。% 用于分隔它。
一台 Windows 机器将有一个,例如 %1。
一台 Unix 机器会有一个,例如 %eth0。使用接口名称作为区域索引。
% 符号表示 IPv6 区域或范围 ID。
开源 IPAddress Java 库将验证 IPv6 的所有标准表示。您可以提取区域,如图所示。免责声明:我是那个图书馆的项目经理。
代码示例:
try {
IPAddressString str = new IPAddressString("fe80:0:0:0:f06c:31b8:cd17:5a44%5");
IPAddress addr = str.toAddress();
if(addr.isIPv6() || addr.isIPv6Convertible()) {
IPv6Address ipv6Addr = addr.toIPv6();
String zone = ipv6Addr.getZone();
IPv6Address noZoneAddr = new IPv6Address(ipv6Addr.getSection());
System.out.println("zone is " + zone + " for address " + noZoneAddr);
}
//use address
} catch(AddressStringException e) {
//e.getMessage has validation error
}
输出:
zone is 5 for address fe80:0:0:0:f06c:31b8:cd17:5a44