2012-11-16 9 views
9

मैं दो एंड्रॉइड डिवाइसों के बीच आईपीवी 6 टीसीपी कनेक्शन बनाने की कोशिश कर रहा हूं। हालांकि सॉकेट बनाना हमेशा विफल रहता है।एंड्रॉइड पर आईपीवी 6 सॉकेट

तो मैं इसे इस तरह का दृष्टांत:

Inet6Address dest = (Inet6Address) InetAddress.getByName(addressString); 
Socket socket = new Socket(dest, portNumber); 

मैं निम्न अपवाद:

java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EINVAL (Invalid argument) 

अगर मैं बजाय का दृष्टांत इस तरह मेरी IPv6Address वस्तु:

Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces(); 
NetworkInterface wifiInterface = null; 
while (networkInterfaces.hasMoreElements()) { 
    NetworkInterface networkInterface = networkInterfaces.nextElement(); 
    if (networkInterface.getDisplayName().equals("wlan0") || networkInterface.getDisplayName().equals("eth0")) { 
    wifiInterface = networkInterface; 
    break; 
    } 
} 
Inet6Address dest = Inet6Address.getByAddress(null, addressBytes, wifiInterface); 
Socket socket = new Socket(dest, portNumber); 

मैं सॉकेट कन्स्ट्रक्टर को कॉल करते समय यह त्रुटि:

java.net.ConnectException: failed to connect to *address* (port *portNumber*): connect failed: EADDRNOTAVAIL (Cannot assign requested address) 

यह जैली बीन और जिंजरब्रेड के साथ नेक्सस वन के साथ एक गैलेक्सी नेक्सस पर होता है।

क्या मैं कुछ गलत कर रहा हूं? इस तरह एक सॉकेट बनाने का सही तरीका क्या है?

इसके अलावा: This post निर्माता

Inet6Address getByAddress (String host, byte[] addr, int scope_id) 

उपयोग करने का सुझाव क्या मैं के रूप में इस मामले में scope_id का उपयोग करना होगा?

+0

हमें dest और portNumber चर मान दिखाएं। –

+0

पते का मूल्य पहले संस्करण में स्ट्रिंग उदाहरण के लिए "fe80 :: 9221: 55ff: fee3: 3303" होगा। संबंधित पताबाइट्स सरणी [-2, -128, 0, 0, 0, 0, 0, 0, -110, 33, 85, -1, -2, -29, 51, 3] है। बंदरगाह के लिए मैं 310 9 का उपयोग कर रहा हूं। यह एक यादृच्छिक बंदरगाह माना जाता है जिसका उपयोग किसी और चीज़ के लिए नहीं किया जा रहा है। –

+0

मौका है राउटर आप IPv6 का समर्थन करने के लिए जुड़े हुए हैं? –

उत्तर

5

चूंकि आपका आईपी पता स्थानीय लिंक है, शायद इसे एक स्कोप आईडी या इंटरफ़ेस के साथ बनाया जाना चाहिए ताकि ओएस जानता हो कि इंटरफ़ेस इसे किस प्रकार बांधने के लिए बाध्य करता है। स्कोप_आईडी निर्दिष्ट करने के लिए, एंड्रॉइड दस्तावेज़ों में कुछ हद तक कमी लगती है। ओरेकल दस्तावेज़ here इंगित करता है कि स्कोप आईडी सिस्टम विशिष्ट है और इसे प्रोग्रामेटिक रूप से निर्धारित नहीं किया जा सकता है।

तो, मैं वैकल्पिक फैक्ट्री विधि का उपयोग करने का प्रयास करूंगा जहां आप स्पष्ट रूप से नेटवर्क इंटरफेस निर्दिष्ट करते हैं जिसे आप उपयोग करना चाहते हैं। विवरण के लिए here देखें। सिस्टमइंटरफेस क्लास में विधियों की खोज करने के लिए विधियां हैं जो सिस्टम पर इंटरफेस मौजूद हैं।

+0

धन्यवाद! लेकिन क्या यह नहीं है कि मैं दूसरे संस्करण में फैक्ट्री विधि का उपयोग करता हूं, जो केवल थोड़ा अलग अपवाद फेंकता है? –

+0

आप सही हैं! उसके लिए माफ़ करना! आपने नेटवर्कइंटरफेस ऑब्जेक्ट को कैसे खोजा जिसे आपने उस प्रयास में उपयोग किया था? – schtever

+0

मैं सभी उपलब्ध इंटरफेस के माध्यम से पुन: प्रयास करता हूं और मुझे नाम से एक की आवश्यकता है और मैंने सत्यापित किया है कि मैं वास्तव में सही इंटरफ़ेस वापस प्राप्त कर रहा हूं। मैंने स्पष्टता के लिए मूल पोस्ट में कोड जोड़ा। –

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