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