Java中的奇怪符号用Java表示

问题描述 投票:2回答:3

当我调用方法NetworkInterface.getInetAddresses()时,我得到以下字符串:

"fe80:0:0:0:f06c:31b8:cd17:5a44%5"

我想知道%5在这里意味着什么?没有这个%5,是否有可能使用IPv6地址?

java network-programming ipv6
3个回答
6
投票

它在这里解释:

Inet6Adress - Format

指定scope_id的一般格式如下:

*IPv6-address%scope_id*

IPv6地址是如上所述的文字IPv6地址。 scope_id是指本地系统上的接口,可以通过两种方式指定。

  1. 作为数字标识符。这必须是一个正整数,用于标识系统所理解的特定接口和范围。通常,数值可以通过系统上的管理工具确定。每个接口可以有多个值,每个范围一个。如果未指定范围,则使用的默认值为零。
  2. 作为一个字符串。这必须是NetworkInterface.getName()针对特定接口返回的确切字符串。以这种方式创建Inet6Address时,通过查询相关的NetworkInterface在创建对象时确定数字scope-id。

另请注意,可以从NetworkInterface类返回的Inet6Address实例中检索数字scope_id。这可用于查找系统上配置的当前范围ID。


2
投票

5是区域索引。 %用于分隔它。

Windows机器将具有%1之类的机器。

Unix机器会有一个例如%eth0。使用接口名称作为区域索引。


0
投票

%符号表示Ipv6区域或范围ID。

The open-source IPAddress Java library将验证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
© www.soinside.com 2019 - 2024. All rights reserved.