2011-11-29 6 views
11

मेरे पास एक ऐसी सेवा है जो सर्वरस्केट बनाता है और localhost:7060 पर बांधती है। जब मैंने अपने एंड्रॉइड डिवाइस पर "netstat -an" किया, तो मुझे लगता है कि यह ipv4 localhost इंटरफ़ेस के बजाय ipV6 localhost का उपयोग कर रहा है।आईपीवी 4 की बजाय मेरी सेवा हमेशा ipv6 localhost से क्यों जुड़ी है?

उत्पादन इस तरह है:
tcp6 0 0 :: ffff: 127.0.0.1: 7060 ::: * सुनें

बंदरगाहों कि आईपीवी 4 का उपयोग इस तरह सूचीबद्ध हैं:
टीसीपी 0 0 127.0.0.1:5060 0.0.0.0:* LISTEN

आईपीवी 4 का उपयोग करने के लिए इसे मजबूर करने की चाल क्या है? मैं iptables का उपयोग कर एक बंदरगाह आगे नियम स्थापित कर रहा हूँ। संस्करण I ipv4 गंतव्य पते का समर्थन करता है।

इस प्रकार मैं पोर्ट पर सुनने के लिए अपना जावा कोड बना रहा हूं।

InetAddress localAddress = Inet4Address.getByName("localhost"); //InetAddress localAddress = Inet4Address.getLocalHost(); sockServer = new ServerSocket(nPort, 20, localAddress);

मैं अपने सेवा के स्टार्टअप में आईपीवी 4 को पसंद करते हैं प्रणाली संपत्ति की स्थापना जैसे अन्य सलाह का पालन किया। इससे कोई फर्क नहीं पड़ता।

System.setProperty("java.net.preferIPv4Stack", "true");

मैं Android 2.3 एक एम्बेडेड डिवाइस के लिए बनाया गया यह चल रहा हूँ।

अद्यतन: मैंने एंड्रॉइड पेड़ में InetAddress.java स्रोतों की जांच की। यह उपरोक्त ध्वज को नीचे की तरह एक रेखा के साथ पढ़ रहा है।

static boolean preferIPv6Addresses() { 
     String propertyName = "java.net.preferIPv6Addresses"; 
     String propertyValue = AccessController.doPrivileged(new PriviAction<String>(propertyName)); 
     return Boolean.parseBoolean(propertyValue); 
    } 

अब मुझे यकीन है कि System.setProperty() कॉल वास्तव में ऊपर कोड द्वारा पढ़ा मूल्य बदल रहा है नहीं कर रहा हूँ।

+0

मुझे लगता है कि उन सिस्टम गुण ओएस में हैं, और उन्हें प्रोग्रामिक रूप से बदलना नहीं होगा (क्योंकि सभी ऐप्स एक ही सिस्टम गुणों पर निर्भर करते हैं)। –

+2

(चूंकि इस पुराने धागे को कहीं और संदर्भित किया गया था, मुझे लगता है कि कुछ स्पष्टीकरण की आवश्यकता है।) ':: 1' आईपीवी 6 लोकलहोस्ट पता है। ':: एफएफएफ: 127.0.0.1' नहीं है, यह आईपीवी 4 लोकेशनहोस्ट एड्रेस आईपीवी 6 नोटेशन (एक तथाकथित" आईपीवी 4 मैप किया गया "आईपीवी 6 पता) है। इसका उपयोग दोहरी-स्टैक्ड सॉकेट के लिए किया जाता है जो आईपीवी 4 और आईपीवी 6 पैकेट दोनों को स्वीकार कर सकते हैं। (हालांकि एक सॉकेट को 'tcp46' लेबल किया जाना चाहिए, फिर।) – Dubu

उत्तर

2

सिद्धांत में एक आईपीवी 6 सर्वर आईपीवी 4 भी सुनता है, क्योंकि आईपीवी 4 एड्रेस स्पेस आईपीवी 6 का सबसेट है, क्या इससे आपको वास्तविक समस्याएं आती हैं?

एक चाल जो काम कर सकती है वह "लोकलहोस्ट" के बजाय "127.0.0.1" का उपयोग करना है, जिसमें आईपीवी 4 और आईपीवी 6 पते हैं।

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