2011-01-03 17 views
6

Java'yı kullanarak, 4 veya 6 sürümlerinde bir IP verildiğinde, FQDN'sini döndürecek basit bir program yazmaya çalışıyorum. Aşağıdaki kod, bir ipv4 adresi verildiğinde düzgün çalışır, ancak yalnızca bir ipv6 adresi girildiğinde verilen adresi döndürür. Ben ipv6 bir FQDN için çözümleyeceğini biliyorum bile ben bir IPv6 GetHostName (girdiğinizdeNeden Java'nın InetAddress sınıfı ipv6 adreslerini FQDN'lerine çözüyor?

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();); 

) sadece, aynı ipv6 dönecektir. Ayrıca, ıpAddress yerine ipv6.google.com gibi bir ipv6 ana bilgisayar adı girerseniz, istisna gerçekleşir.

Bu eşyalara yeniyim, bu yüzden herhangi bir yardımı takdir ediyorum. Teşekkürler.

+1

Ev sahibi/ağınızın kesinlikle IPv6 DNS var mı? Nslookup doğru sonucu alıyor mu? –

+0

Evet. nslookup iyi çalışıyor. – user561877

cevap

1

inet.getCanonicalHostName(); numaralı "Bu IP adresi için tam etki alanı adını alır."

InetAddress öğesini InetAddress.getByName() kullanarak yapılandırırsanız, getHostName(), oluşturduğunuz şeyi döndürür. getCanonicalHostName(), bir ters isim aramaya zorlar.

+0

Aslında bunu denedim ama başarıya ulaşmamıştım. Hala aynı problem. – user561877

2

Sorun aslında çalıştırdığım Java'nın sürümüdür. 1.6.21'den 1.6.23'e Java güncellemesi, ipv6'ların FQDN'lerine çözümlenmesine izin verdi.

+2

Kendi cevabınızı "cevap" olarak işaretlemek isteyebilirsiniz. Yanındaki onay işaretini tıklayın (yeşile çevirin). –

0

public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException; 
yapar Inet4 (veya 6) AddressImpl örneğine arama temsilci IPv6 ve IPv4 ad çözünürlüğü vb GetByName vb gibi statik yöntemlerin grup var etmek mümkün değildir java.net.InetAddress kullanma

Artık eğlence a) tüm bunlar özel/paket yereldir, dolayısıyla InetAddress sınıfına impl sınıflarını enjekte etme yolu yoktur. B) Inet4 (veya 6) AddressImpl sınıflarının kendileri yerel pakettir. Yani, bir ipv4 veya ipv6 arama/ad çözümleme anında yapmak için bir yolu yoktur. Bu sınıflar için tüm uzatma noktalarının engellenmesi, onları gerçekten çok sınırlı kullanım ve esneklik haline getirmem. Gerçek kara büyüsü burada, InetAddress sınıfı, statik olarak, impl'leri başlatır, burada yöntemin sonucu ne olur? Benim Linux kurulum ipv6 destekler, ipv6.google.com gibi ipv6 hostnames için dns aramaları yapabilirim. Ben hostnamei neler hızlı bir soruşturma yaptık

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

herkes arama vb ipv4/v6 programları için java iyi net kütüphanenin yönüne beni işaret edebilir, takdir Will < -> java 8, Windows 7. ipv6 çözünürlüğü 'varsayılan' gibi görünüyor NameService hiç ipv6 ile çalışmaz! Ama! Java, 'dns, sun' adı verilen başka bir JNDI tabanlı NameService uygulaması ile gelir. Bu nedenle,

-Dsun.net.spi.nameservice.provider'ı kullanarak etkinleştirirseniz.yapabilirsiniz java ipv6'da hakkında bu

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

diğer bilgiler gibi v4 ve v6 adresleri için> hostname çözünürlük - 1 = dns, güneş

veya

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

Eğer çift yönlü ip < alacak Burada bulabilirsiniz http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/

İlgili konular