2011-04-11 13 views
9

स्थानीय होस्ट नाम को निर्धारित करने के लिए यहां कुछ कोड दिया गया है जो बहु-होम बॉक्स पर काम करना है:InetAddress.isSiteLocalAddress() वास्तव में क्या मतलब है?

 /** 
* Work out the first local host name by iterating the network interfaces 
* 
* @return 
* @throws SocketException 
*/ 
private String findFirstLocalHostName() throws SocketException { 

    Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces(); 
    while (ifaces.hasMoreElements()) { 
     NetworkInterface iface = ifaces.nextElement(); 
     Enumeration<InetAddress> addresses = iface.getInetAddresses(); 
     while (addresses.hasMoreElements()) { 
      InetAddress add = addresses.nextElement(); 
      if (!add.isLoopbackAddress() && add.isSiteLocalAddress()) { 
       return add.getHostName(); 
      } 
     } 
    } 
    throw new RuntimeException("Failed to determine local hostname"); 
} 

क्या कॉल करने के लिए SiteLocalAddress एक बग पेश करता है? मुझे इस विधि के बारे में कोई उपयोगी जानकारी नहीं मिल रही है, लेकिन मुझे एहसास है कि यह केवल आईपी वी 6 से संबंधित है और इसे हटा दिया गया है।

+0

स्पष्टता के लिए, मेरा मतलब यह नहीं था कि विधि अब मान्य किया गया था ... बस की "साइट स्थानीय" प्रति कि http आईपीवी 6 में पता धारणा: //www.ietf .org/rfc/rfc3879.txt – TiGz

उत्तर

13

विधि definitely not deprecated है और यह निश्चित रूप से आईपीवी 6 में उपयोग नहीं किया जाता है।

आईपीवी 4 में 3 network address ranges that are defined for site-local addresses: 10/8, 172.16/12 और 1 9 .168/16 है।

पढ़ना Inet4Address.isSiteLocalAddress() दिखाता है कि उन 3 नेटवर्कों के पते उन तरीकों पर true लौटाएंगे।

प्रभावी रूप से यह आपको बताता है कि आपके पास पता निश्चित रूप से सार्वजनिक नहीं है (ध्यान दें कि यह विधि false लौटाती है, तो पता अभी भी सार्वजनिक नहीं हो सकता है)।

+2

देखें [यहां] (http://books.google.co.in/books?id=NyxObrhTv5oC&lpg=PT187&dq=InetAddress.isSiteLocalAddress() और pg = PT186 # v = onepage और q & f = false)। यह पता चलता है कि पता एक आईपीवी 6 साइट-स्थानीय पता है। –

+0

@ जॉन: हाँ, मुझे पता है कि आईपीवी 6 में भी इसी तरह का अर्थ है, लेकिन मुझे इसके बारे में जानकारी नहीं है। लेकिन चूंकि इस सवाल से संकेत मिलता है कि यह केवल आईपीवी 6 है, मैं उस पहलू को स्पष्ट करना चाहता था। (वैसे, मैं आपके द्वारा लिंक किए गए पृष्ठ को नहीं पढ़ सकता)। –

1

कार्यान्वयन को देखते हुए ...

एक Inet4Address के लिए, यह अगर यह RFC1918 "unrouteable" पतों में से एक है देखने के लिए जाँच करता है: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/ 16।

Inet6Address के लिए, यह पहले दो ऑक्टेट्स को जांचता है कि यह वास्तविक "साइट स्थानीय" पता है या नहीं।

-1

जहां तक ​​मुझे पता है कि isSiteLocalAddress विधि को बहिष्कृत नहीं किया गया है।

isSiteLocalAddress - स्पष्टीकरण

का संकेत करता है, तो InetAddress कोई साइट स्थानीय पता है, या गलत अगर पता साइट स्थानीय यूनिकास्ट पता नहीं है।

इनेट एड्रेस में दो प्रत्यक्ष उप-वर्ग भी हैं;

Inet4Address और Inet6Address

सबसे अच्छा शर्त Javadocs को पढ़ने के लिए है।

जेडीके का कौन सा संस्करण आप उपयोग कर रहे हैं?

0

'साइट लोकल' निजी आईपी स्पेस के लिए एक बहिष्कृत नाम है। (कुछ बारीकियों, लेकिन मूल रूप से सही है।) आरएफसी देखें 1918

0

मैं सिर्फ मैं क्या विश्वास करते हैं एक ऐसी ही समस्या है भर में आया था: निर्धारित करने के लिए क्या आईपीवी 6 मैं लैन comuncation के लिए इस्तेमाल करना चाहिए की कोशिश कर रहा:

  • आईएमएचओ, Inet6Address.isSiteLocalAddress() बेकार है। यह देखते हुए कि 0xFEC0 उपसर्ग को RFC 3879 द्वारा @tigz के रूप में वर्णित किया गया है।मैं अभी तक किसी भी उपकरण (एंड्रॉयड, जीत, OSX) को देखने के लिए हालांकि (मेरी समझ और पढ़ने से यातायात के लिए इस्तेमाल किया जा नहीं होना चाहिए वास्तव में एक 0xFEC0 (सीमित परीक्षण के साथ)

    //from java.net.Inet6Address (1.8.0_45) boolean isSiteLocalAddress() { return ((ipaddress[0] & 0xff) == 0xfe && (ipaddress[1] & 0xc0) == 0xc0); }

  • 0xFE80 पता है (www.cisco.com है)) मेरे एकल राउटर (पिंग 6, कर्ल, http) के साथ लैन संचार के लिए काम किया।

  • मेरा ग्लोबल यूनिकास्ट (जो सार्वजनिक आईपी के लिए सिर्फ एक और नाम है) 2601::/20 कॉमकास्ट से मेरे लैन संचार के लिए काम किया। तो मैं कहूंगा कि यह उपयोग करने के लिए सही पता है।

उपसर्ग तालिका: www.iana.org

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