2011-01-03 18 views
6

मैं जावा का उपयोग करके एक साधारण प्रोग्राम लिखने की कोशिश कर रहा हूं, जिसे संस्करण 4 या 6 प्रारूप में एक आईपी दिया गया है, इसकी एफक्यूडीएन वापस कर देगा। IPv4 पता दिए जाने पर निम्न कोड ठीक काम करता है, लेकिन एक आईपीवी 6 पता दर्ज होने पर केवल दिए गए पते को ही वापस कर देगा।जावा की InetAddress क्लास अपने FQDN पर ipv6 पते को हल क्यों नहीं कर रहा है?

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 getHostName (प्रवेश) केवल एक ही IPv6 वापस आ जाएगी, तब भी जब मुझे पता है कि IPv6 एक FQDN हो जाएगी। साथ ही, अगर मैं ipv6 होस्ट नाम दर्ज करता हूं, जैसे ipv6.google.com, IpAddress के स्थान पर, अपवाद होगा।

मैं इस सामान के लिए नया हूं इसलिए किसी भी सहायता की सराहना करता हूं। धन्यवाद।

+1

क्या आपके होस्ट/नेटवर्क में निश्चित रूप से आईपीवी 6 डीएनएस काम कर रहा है? क्या nslookup सही परिणाम मिलता है? –

+0

हां। nslookup ठीक काम करता है। – user561877

उत्तर

1

inet.getCanonicalHostName(); आज़माएं जो "इस आईपी पते के लिए पूरी तरह से योग्य डोमेन नाम प्राप्त करता है।"

यदि आप InetAddress.getByName() का उपयोग करते हुए InetAddress का निर्माण करते हैं, getHostName() आपके द्वारा निर्मित किए गए कार्यों को वापस कर देगा। getCanonicalHostName() एक रिवर्स नाम लुकअप को मजबूर करता है।

+0

मैं वास्तव में पहले ही कोशिश कर चुका था लेकिन कोई सफलता नहीं। अभी भी एक ही समस्या है। – user561877

2

समस्या वास्तव में जावा का संस्करण था जो मैं चल रहा था। 1.6.21 से जावा को 1.6.23 पर अपडेट करना, ipv6s को उनके FQDN को हल करने की अनुमति है।

+2

आप अपने उत्तर को "उत्तर" के रूप में चिह्नित करना चाहते हैं। इसके बगल में स्थित चेकमार्क पर क्लिक करें (इसे हरा करें)। –

0

java.net.InetAddress का उपयोग IPv6 और IPv4 नाम संकल्प आदि getByName आदि की तरह स्थिर तरीकों में से गुच्छा के लिए Inet4 (या 6) AddressImpl का उदाहरण है कि

public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException; 
करता है करने के लिए देखने को सौंपने यह संभव नहीं है

अब मज़ेदार है ए) ये सभी निजी/पैकेज स्थानीय हैं इसलिए इन्टैड्रेस क्लास में इम्प्लेट क्लास को इंजेक्ट करने का कोई तरीका नहीं है b) Inet4 (या 6) पता Impl कक्षाएं स्वयं स्थानीय पैकेज हैं। तो कहने का कोई तरीका नहीं है, फ्लाई पर आईपीवी 4 या आईपीवी 6 लुकअप/नाम रिज़ॉल्यूशन करें। मुझे इन वर्गों के लिए वास्तव में बहुत ही सीमित उपयोग और लचीलापन बनाने के लिए सभी एक्सटेंशन बिंदु अवरुद्ध नहीं किया गया है। असली ब्लैक-जादू यहां होता है, जहां InetAddress क्लास स्थाई रूप से इंप्रेशन को प्रारंभ करता है, विधि का परिणाम क्या है IIPv6 समर्थित() निर्भर ?? मेरा लिनक्स सेटअप ipv6 का समर्थन करता है, मैं ipv6.google.com जैसे ipv6 होस्टनाम के लिए डीएनएस लुकअप कर सकता हूं। अगर किसी को भी देखने आदि जैसे IPv4/v6 उपयोगिताओं के लिए जावा में एक अच्छा शुद्ध पुस्तकालय की दिशा में मुझे इंगित कर सकते हैं

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

मैं क्या होस्ट नाम के साथ हो रहा है की एक त्वरित जांच किया है सराहना करेंगे < -> जावा 8 में आईपीवी 6 रिज़ॉल्यूशन, विंडोज 7. ऐसा लगता है कि 'डिफ़ॉल्ट' नाम सेवा IPv6 के साथ काम नहीं करती है! लेकिन! जावा एक और, जेएनडीआई आधारित नाम सेवा कार्यान्वयन के साथ आता है जिसे 'डीएनएस, सन' कहा जाता है। तो, आप या तो

-Dsun.net.spi.nameservice.provider का उपयोग कर इसे सक्षम है।इस

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

अधिक जावा IPv6 आप कर सकते हैं के बारे में जानकारी की तरह v4 और v6 पतों के लिए> होस्ट नाम संकल्प - 1 = dns, सूरज

या

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

आप द्विदिश आईपी < मिल जाएगा यहां खोजें http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/

संबंधित मुद्दे