2011-01-03 2 views
6

버전 4 또는 6 형식의 IP가 주어지면 주어진 FQDN을 반환하는 Java를 사용하여 간단한 프로그램을 작성하려고합니다. 다음 코드는 ipv4 주소가 주어지면 잘 작동하지만 ipv6 주소를 입력 할 때만 주어진 주소를 반환합니다. 나는 IPv6를이 FQDN에 해결할 수 있다고 알고있는 경우에도 내가의 IPv6 getHostName의를 (입력 할 때마다Java의 InetAddress 클래스가 ipv6 주소를 해당 FQDN으로 확인하지 않는 이유는 무엇입니까?

InetAddress inet; 
try { inet = InetAddress.getByName(theIpAddress); } 
catch(UnknownHostException e) { System.out.println("Unknown Host"); return; } 

System.out.println(inet.getHostAddress();); 
System.out.println(inet.getHostName();); 

은) 단지, 같은 IPv6를 반환합니다. 또한 ipAddress 대신 ipv6.google.com과 같은 ipv6 호스트 이름을 입력하면 예외가 발생합니다.

본인은이 제품을 처음 사용하므로 도움이 될 것입니다. 감사.

+1

호스트/네트워크에 IPv6 DNS가 제대로 작동합니까? nslookup에서 올바른 결과를 얻을 수 있습니까? –

+0

예. nslookup이 정상적으로 작동합니다. – user561877

답변

1

inet.getCanonicalHostName(); "이 IP 주소의 정규화 된 도메인 이름을 가져옵니다."를 시도하십시오.

InetAddress.getByName()을 사용하여 InetAddress를 구성하면 getHostName()이 생성 한 값을 반환합니다. getCanonicalHostName()은 역 이름 조회를 강제 실행합니다.

+0

나는 실제로 이미 시도했지만 성공하지 못했습니다. 여전히 같은 문제. – user561877

2

문제점은 실제로 실행중인 Java 버전입니다. Java를 1.6.21에서 1.6.21로 업데이트하면 ipv6s가 FQDN을 확인할 수있었습니다.

+2

자신의 답변을 "답변"으로 표시 할 수 있습니다. 옆에있는 체크 표시를 클릭하십시오 (녹색으로 바꿉니다). –

0

public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException; 
않는 Inet4 (6) AddressImpl의 인스턴스 룩업 위임 IPv6 및 IPv4의 이름 해석 등 getByName 등 같은 정적 방법의 무리를하는 것이 불가능 java.net.InetAddress의 사용

재미는 a) 모두 개인/패키지 로컬이므로 InetAddress 클래스에 impl 클래스를 삽입 할 방법이 없습니다. b) Inet4 (또는 6) AddressImpl 클래스는 패키지 로컬입니다. 그래서 말할 방법이 없습니다. 즉석에서 ipv4 또는 ipv6 조회/이름 확인을 수행하십시오. 나는이 클래스들에 대해 모든 확장 포인트가 차단되어서 실제로 매우 제한된 사용과 유연성을 갖도록하는 방법을 얻지 못합니다. InetAddress 클래스가 impls를 정적으로 초기화하는 곳에서 실제 black-magic이 발생합니다. isIPv6Supported() 종속 결과에 따라 결과가 어떻게됩니까? 필자의 Linux 설정은 ipv6을 지원하므로 ipv6.google.com과 같은 ipv6 호스트 이름에 대한 DNS 조회를 수행 할 수 있습니다. 내가 호스트 이름으로 무슨 일이 일어나고 있는지에 대한 간단한 조사를 한 적이

class InetAddressImplFactory { 

    static InetAddressImpl create() { 
    Object o; 
    if (isIPv6Supported()) { 
     o = InetAddress.loadImpl("Inet6AddressImpl"); 
    } else { 
     o = InetAddress.loadImpl("Inet4AddressImpl"); 
    } 
    return (InetAddressImpl)o; 
    } 

    static native boolean isIPv6Supported(); 
} 
1

사람이 조회 등과 같은의 IPv4/v6으로 유틸리티의 자바에 좋은 순 라이브러리의 방향으로 날 지점 수 있다면 가 감사합니다 < -> Java 8, Windows 7의 ipv6 해상도. 'default'NameService가 ipv6과 전혀 작동하지 않습니다! 하지만! 자바에는 'dns, sun'이라는 JNDI 기반 NameService 구현이 함께 제공됩니다. 따라서

-Dsun.net.spi.nameservice.provider를 사용하여 활성화 한 경우.당신이 할 수있는 자바의 IPv6에 대한이

InetAddress.getAllByName(...) 
address.getHostName() 

더 많은 정보와 같은 V4와 V6 주소> 호스트 이름 확인 - 1 = DNS, 태양

또는

System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun"); 

당신은 양방향 IP <을 얻을 것이다 찾기 http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/