2014-11-19 4 views
2

В моем заявлении о проблеме говорится, что я могу получить либо адрес IPv4, либо v4-отображаемый адрес v6 в качестве экземпляра InetSocketAddress. Если это v4-отображаемый адрес v6, я должен получить адрес v4 и использовать его.Пытается получить IPv4-адрес из заданного IPv4-адреса IPv6-адреса

Я читал Javadoc из InetAddresses и это то, что он говорит:

`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 от такого отображенного ввода. Значит ли это, что листинг типа InetAddress, полученный от InetSocketAddress до Inet4Address, будет достаточным?

Inet4Address inetAddress = (Inet4Address) socketAddress.getAddress(); 

Если да, то я даже не нужно использовать InetAddresses.isMappedIPv4Address? Как я могу определить, не сработало ли кастинг или данный адрес не является допустимым адресом IPv4 или адресом v6 с отображением v4, поэтому я могу сделать соответствующее исключение?

ответ

0

The IPAddress Java library поддерживает как IPv4, так и IPv6 полиморфным образом. Он может выполнить то, что вы здесь описываете.

Во-первых, с помощью этой библиотеки, с InetSocketAddress вы можете получить IPAddress:

InetSocketAddress inetSocketAddress = ...; 
IPAddress addr = IPAddress.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.getLowerIPv4Address(); 
     Inet4Address addr = ipv4Address.toInetAddress(); 
     ... 
    } 
} 

Javadoc доступен по ссылке.

Смежные вопросы