2013-01-08 12 views
5

ब्रॉडकास्ट करता है तो मैं एंड्रॉइड 3.2.1 (एचटीसी फ्लायर) पर जेएमडीएन का उपयोग करने की कोशिश कर रहा हूं और मैं सेवा खोज के लिए जेएमडीएन का उपयोग कर रहा हूं। सब कुछ अच्छी तरह से काम करता है सिवाय इसके कि मेरे तीन उपकरणों में से एक (उनमें से बाकी ठीक काम करते हैं) आईपीवी 4 के बजाय आईपीवी 6 पता प्रसारित कर रहा है। यह बहुत अजीब है क्योंकि वे सभी मेरे घर नेटवर्क से डीएचसीपी पर जुड़े हुए हैं, इसलिए वे सभी आईपीवी 4 पते असाइन किए गए हैं।जेएमडीएनएस आईपीवी 4 इंटरफ़ेस पर पंजीकृत है, लेकिन आईपीवी 6

तो अपने डिवाइस पर मैं

android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE); 
    multicastLock = wifi.createMulticastLock("mylockthereturn"); 
    multicastLock.setReferenceCounted(true); 
    multicastLock.acquire(); 
    try { 
     jmdns = JmDNS.create(); 

     jmdns.registerServiceType(jmdnsType); 
     String jmdnsName = /* Read from db */; 
     serviceInfo = ServiceInfo.create(jmdnsType, huggler_id, server.getLocalPort(), " blah blah"); 

     jmdns.registerService(serviceInfo); 
     Log.d(TAG, "JMDNS service registered on ip " + jmdns.getInterface()); 
    } catch (IOException e) { 
     Log.e(TAG, "Error creating JMDNS service (" + e.getMessage() + ")"); 
     e.printStackTrace(); 
    } 

चलाने और यह अच्छा आईपीवी 4 आईपी जो वास्तव में मेरे नेटवर्क (सफलता) द्वारा आवंटित रूप से मेल खाना बाहर प्रिंट करता है।

लेकिन जब मैं कोड चलाता हूं जो अन्य उपकरणों पर सेवाओं को खोजता है।

for(ServiceInfo si : jmdns.list(jmdnsType, 6000)) { // timeout: 6s 
     if (si.getName().equals(jmdnsNAme)) 
      continue; 
     try { 
      Log.d(TAG, "Host has " + si.getInet4Addresses().length + " v4 addresses. "); 
      Log.d(TAG, "Host has " + si.getInet6Addresses().length + " v6 addresses. "); 


} 

और जब यह फ्लायर को खोजता है तो यह बिल्कुल एक v6 पता दिखाता है।

क्या कोई सुझाव दे सकता है कि क्या हो सकता है?

मैं जेएमडीएन 3.4.0 का उपयोग कर रहा हूं (3.4.1 बिल्कुल काम नहीं करता है!) और मैं एक ज़ीरोकॉन्फ नौसिखिया हूं।

अद्यतन:

कुछ नई जानकारी:

D/Huggler (5691): Host has 0 v4 addresses. 
    D/Huggler (5691): Host has 1 v6 addresses. 
    D/Huggler (5691): Host IPv6 address is fe80::66a7:69ff:feeb:9083 
    D/Huggler (5691): Host IPv6 hostname is fe80::66a7:69ff:feeb:9083 
    D/Huggler (5691): Host is linklocal true 

किसी को भी मदद कर सकते हैं उन की व्याख्या?

+0

कि IPv6 पता लिंक स्थानीय नहीं होगा (यानी, fe80 :: कुछ)? – fge

+0

इसके अलावा, यदि आप JVM तर्कों को नियंत्रित कर सकते हैं, तो क्या आपने '-Djava.net.preferIPv4Stack = true' जोड़ने का प्रयास किया है? यदि हां, तो क्या आपके पास अभी भी यह बग है? – fge

+0

आपकी टिप्पणी के लिए धन्यवाद, fge। पहली टिप्पणी: क्या आप उस पर विस्तार कर सकते हैं? (अगर मैं आपको सही ढंग से समझता हूं, तो आप कह रहे हैं कि यह 127.0.0.1 के बराबर आईपीवी 6 है? यह मेरे प्रश्न के पहले भाग को कैसे समझाएगा) दूसरी टिप्पणी: एंड्रॉइड के लिए संकलन करते समय मैं यह सेटिंग्स कैसे सेट करूं? मुझे लगता है कि मैं – siemanko

उत्तर

8

एक ही समस्या को देख रहा था, लेकिन jmDNS.create को कॉल में InetAddress में गुजरने से चाल चल रही थी।

तो जैसे कुछ प्रयास करें:

WifiManager wifi = (WifiManager)getActivity().getSystemService(android.content.Context.WIFI_SERVICE); 
String ip = Formatter.formatIpAddress(wifi.getConnectionInfo().getIpAddress()); 
jmdns = JmDNS.create(InetAddress.getByName(ip)); 
संबंधित मुद्दे