【发布时间】:2015-01-17 01:27:24
【问题描述】:
我的问题陈述说我可以接收 IPv4 地址或 v4 映射的 v6 地址作为 InetSocketAddress 实例。如果它是 v4 映射的 v6 地址,我必须派生 v4 地址并使用它。
我正在阅读 InetAddresses 的 javadoc,它是这样写的:
`Technically one can create a 128bit IPv6 address with the wire format of a
"mapped" address, as shown above, and transmit it in an IPv6 packet header.
However, Java's InetAddress creation methods appear to adhere doggedly to the
original intent of the "mapped" address: all "mapped" addresses return
Inet4Address objects.`
我可以使用以下库中的一种方法来确定接收到的地址是否是 v4 映射的 v6 地址:
// Input is InetSocketAddress socketAddress
if (InetAddresses.isMappedIPv4Address(socketAddress.getAddress().getHostAddress())) {
System.out.println("This is a v4 mapped v6 address");
}
根据文档,没有任何库(InetSocketAddress、InetAddress 或 InetAddresses)提供从此类映射输入派生 IPv4 地址的方法。那么这是否意味着将从 InetSocketAddress 收到的 InetAddress 类型转换为 Inet4Address 就足够了?
Inet4Address inetAddress = (Inet4Address) socketAddress.getAddress();
如果是这样,我什至需要使用 InetAddresses.isMappedIPv4Address 吗?如何确定转换是否失败或给定地址既不是有效的 IPv4 地址也不是 v4 映射的 v6 地址,以便引发适当的异常?
【问题讨论】:
标签: java ip-address ipv6 ipv4