2014-11-19 10 views
2

문제점 설명에 IPv4 주소 또는 v4 매핑 된 v6 주소를 InetSocketAddress 인스턴스로받을 수 있다고 나와 있습니다. v4 매핑 된 v6 주소 인 경우 v4 주소를 파생시켜 사용해야합니다.주어진 IPv4 매핑 된 IPv6 주소에서 IPv4 주소를 추출하려고 시도합니다.

나는 된 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로받은 InetAddress를 Inet4Address로 형식 변환하는 것으로 충분합니까?

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

그렇다면 InetAddresses.isMappedIPv4Address를 사용해야합니까? 적절한 예외를 throw 할 수 있도록 캐스팅에 실패했거나 지정된 주소가 유효한 IPv4 주소 또는 v4 매핑 된 v6 주소가 아닌지 어떻게 확인할 수 있습니까?

답변

0

The IPAddress Java library은 다형성 방식으로 IPv4와 IPv6을 모두 지원합니다. 여기서 설명하는 것을 성취 할 수 있습니다. 거기에서

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

당신이 IPv4 또는 IPv6를 확인할 수 있습니다 :

첫째, 해당 라이브러리를 사용하여 InetSocketAddress 당신이하여 IPAddress를 얻을 수

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은 링크에서 사용할 수 있습니다.

관련 문제