【问题标题】:Trying to derive IPv4 address from given IPv4-mapped IPv6 address尝试从给定的 IPv4 映射 IPv6 地址派生 IPv4 地址
【发布时间】: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


    【解决方案1】:

    The IPAddress Java library 以多态方式同时支持 IPv4 和 IPv6。它可以完成您在此处描述的内容。

    首先,使用该库,通过您的 InetSocketAddress,您可以获得一个 IPAddress:

    InetSocketAddress inetSocketAddress = ...;
    IPAddress addr = new IPAddressGenerator().from(inetSocketAddress.getAddress());
    

    从那里,您可以检查 IPv4 或 IPv6:

    boolean isIpv4 = addr.isIpv4();
    boolean isIpv6 = addr.isIpv6();
    

    那么如果是 ipv6 或 ipv6,就可以使用关联的子类。如果是 IPv6,您可以从那里检查地址是否映射 IPv4、是否兼容 IPv4,等等。如果是这样,您可以获得派生的 IPv4 地址。之后,您可以转换回 java.net 类型的实例。

    if(isIpv4) {
        IPv4Address ipv4Address = addr.toIPv4();
        Inet4Address addr = ipv4Address.toInetAddress();
        ...
    } else if(isIpv6) {
        IPv6Address ipv6Address = addr.toIPv6();
        if(ipv6Address.isIPv4Compatible() || ipv6Address.isIPv4Mapped()) {
            IPv4Address derivedIpv4Address = ipv6Address. getEmbeddedIPv4Address();
            Inet4Address addr = ipv4Address.toInetAddress();
            ...
        }
    }
    

    javadoc 可在链接中找到。

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2012-04-11
      • 1970-01-01
      • 2012-06-29
      • 2011-02-16
      相关资源
      最近更新 更多