如何通过Java的NetworkInterface判断IPv6地址为首选或临时地址
判断IPv6地址是否为临时/首选地址的方法
1. 识别临时IPv6地址
Java的Inet6Address类(JDK 1.7及以上版本)提供了isTemporaryAddress()方法,可直接判断该IPv6地址是否为RFC 4941定义的隐私临时地址:
import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; public class IPv6TempCheck { public static void main(String[] args) throws Exception { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface ni = interfaces.nextElement(); Enumeration<InetAddress> addresses = ni.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress addr = addresses.nextElement(); if (addr instanceof Inet6Address) { Inet6Address ipv6Addr = (Inet6Address) addr; boolean isTemporary = ipv6Addr.isTemporaryAddress(); System.out.printf("IPv6地址: %s, 是否为临时地址: %b%n", addr.getHostAddress(), isTemporary); } } } } }
2. 识别首选IPv6地址
要判断地址是否为接口的首选地址,需通过NetworkInterface的getInterfaceAddresses()方法获取InterfaceAddress实例,调用其isPreferred()方法即可:
import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.util.Enumeration; import java.util.List; public class IPv6PreferredCheck { public static void main(String[] args) throws Exception { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface ni = interfaces.nextElement(); List<InterfaceAddress> interfaceAddresses = ni.getInterfaceAddresses(); for (InterfaceAddress ifAddr : interfaceAddresses) { if (ifAddr.getAddress() instanceof java.net.Inet6Address) { boolean isPreferred = ifAddr.isPreferred(); System.out.printf("IPv6地址: %s, 是否为首选地址: %b%n", ifAddr.getAddress().getHostAddress(), isPreferred); } } } } }
补充说明
- 若使用低于JDK 1.7的版本,
isTemporaryAddress()方法不可用,此时只能通过调用系统命令(如ip addr、ifconfig)解析输出结果来判断,这种方式依赖操作系统环境,不具备跨平台性。 - 临时地址是系统为隐私保护自动生成的短期地址,首选地址则是接口优先使用的稳定地址(如手动配置、SLAAC生成的非临时地址)。
内容的提问来源于stack exchange,提问作者Peter Jerkewitz
相关产品推荐
相关产品推荐

