2012-02-15 10 views
6

मैंने विंडोज़ पर जावा 6 के साथ एक ज्ञात बग में भाग लिया है। मेरी समझ यह है कि नेटमास्क प्राप्त करने का सामान्य तरीका नेटवर्क उपसर्ग की लंबाई को देखना और कुछ बदलाव करना है। समस्या यह है कि विंडोज़ पर उपसर्ग लंबाई अक्सर गलत तरीके से लौटा दी जाती है, इसलिए हमें एक 128 या 20 0 प्राप्त करना चाहिए।जावा और विंडोज 7: विश्वसनीय रूप से आईपीवी 4 नेटमास्क प्राप्त कर रहा है?

this solution में, यह जावा कमांड लाइन पर -Djava.net.preferIPv4Stack=true डालने का सुझाव दिया जाता है। दुर्भाग्यवश, विंडोज 7 पर, जो कि एक वीएम पैरामीटर या जावा कमांड लाइन पर कोई प्रभाव नहीं पड़ता है।

(ए) क्या किसी को भी इस समस्या के लिए कोई अन्य काम-आसपास पता है जो अभी भी विंडोज 7 पर काम कर सकता है?

(बी) वैकल्पिक रूप से, क्या नेटमास्क विश्वसनीय होने का एक बिल्कुल अलग तरीका है?

धन्यवाद!

पीएस Here is the bug report that pertains to this

+0

उचित शिष्टाचार यह निर्देश देता है कि मैंने अन्य स्थानों की सूची दी है जहां मैंने यह प्रश्न पूछा है: http://stackoverflow.com/questions/9299566/java-windows-7-reliably-getting-ipv4-netmask http: // www। codeguru.com/forum/showthread.php?t=521196 https://forums.oracle.com/forums/thread.jspa?threadID=2347643&tstart=0 http://www.coderanch.com/t/567601/ सॉकेट/जावा/जावा-विंडोज-रिलायली-हो रही-आईपीवी –

+1

अजीब ... '-Djava.net.preferIPv4Stack = true' वीएम विकल्प जेआरई 1.6 के लिए विंडोज 7 के तहत मेरे मामले में काम करता है। मैंने इसे अपने जावा कोड में 'System.setProperty ("java.net.preferIPv4Stack", "true") के रूप में रखा है। जब तक, कुछ (पुस्तकालय या जो भी) इसे रीसेट नहीं कर रहा है। क्या आप अपना आईपी नेटमास्क कोड दिखा सकते हैं? – ecle

+0

कोड की उस पंक्ति के लिए धन्यवाद। मैं नेटबीन्स का उपयोग कर रहा हूं, और वीएम विकल्पों को रखने के लिए एक जगह है। मैंने वहां-डी चीज डालने की कोशिश की। नही जाओ। मैं उन्नत इंस्टॉलर द्वारा बनाए गए रैपर का उपयोग करके एप्लिकेशन लॉन्च कर रहा हूं, और कमांड लाइन विकल्पों को रखने के लिए जगह है। वह या तो काम नहीं किया। मैं आपके सुझाव की कोशिश करने जा रहा हूं, मेरी मुख्य विधि के शीर्ष पर कोड की उस पंक्ति को जोड़ रहा हूं। धन्यवाद! –

उत्तर

3

-Djava.net.preferIPv4Stack=true वीएम विकल्प किसी भी ओएस के तहत काम करना चाहिए। वैकल्पिक रूप से, इसे जावा कोड में System.setProperty("java.net.preferIPv4Stack","true"); के रूप में रखा जा सकता है। जब तक, कुछ (लाइब्रेरी या जो कुछ भी) अपनी सच्ची स्थिति को रीसेट नहीं कर रहा है।

1

चूंकि हम सिर्फ विंडोज 7 में समस्या के कारण, ओएस विशिष्ट समाधान की तलाश क्यों नहीं करते? मुझे पता है कि हम जावा कमांड लाइन या बैट फाइलों सहित जावा से विंडोज प्रोग्राम लॉन्च कर सकते हैं। विंडोज़ में एक पाठ फ़ाइल में ipconfig के आउटपुट को फिर से निर्देशित करने का एक तरीका होना चाहिए। आपका प्रोग्राम ipconfig को कॉल करके और फिर आउटपुट को पढ़कर सबनेट मास्क प्राप्त करने में सक्षम होना चाहिए।

+0

ठीक है, हम इसे Win7 में देख रहे हैं, लेकिन सूर्य की बग उस विशिष्ट नहीं है। किसी भी मामले में, एक ही समाधान विंडोज के किसी भी संस्करण पर काम करना चाहिए।मुझे सीखना है कि ओएस प्रकार की जांच कैसे करें, बाहरी प्रोग्राम को फायर करें, और इसके आउटपुट को कैप्चर करें। और फिर बोनस के रूप में, परिणाम को पार्स करने के लिए शायद कुछ चालाक रेगेक्स चीज़ का उपयोग करें (इसे चार-चार-चार को पार्स करने के लिए कस्टम कोड लिखने के बजाय)। –

2

नीचे दिया गया कोड सबनेट मास्क प्रदर्शित करता है। एक से अधिक नेटवर्क कनेक्शन वाले कंप्यूटर पर (वायरलेस और कैट -5 ईथरनेट कनेक्शन वाले लैपटॉप की तरह) यह सबनेट मास्क को दो बार लिख सकता है क्योंकि क्लाइंट के लिए दो अलग-अलग आईपी पते हो सकते हैं।

String os = System.getProperty("os.name");   
    try { 
     if(os.indexOf("Windows 7")>=0) { 
      Process process = Runtime.getRuntime().exec("ipconfig"); 
      process.waitFor(); 
      InputStream commandOut= process.getInputStream(); 

      BufferedReader in = new BufferedReader(new InputStreamReader(commandOut)); 
      String line; 
      while((line = in.readLine()) !=null) { 
       if(line.indexOf("Subnet Mask")>=0) { 
        int colon = line.indexOf(":"); 
        System.out.println(line.substring(colon+2)); 
       } 
      } 
     } 
    catch(IOException ioe) { } 
    catch(java.lang.InterruptedException utoh) { } 

दोनों एक वायर्ड और वायरलेस कनेक्शन सक्रिय साथ अपने लैपटॉप पर, मैं इस उत्पादन प्राप्त करें: 255.255.254.0 255.255.254.0

जब मैं अपने वायरलेस कनेक्शन बंद कर देते हैं, मैं केवल की एक पंक्ति को देखने के अपेक्षित के रूप में वायर्ड ईथरनेट लिंक के लिए आउटपुट।

+0

यह वास्तव में एक अच्छा जवाब है, हालांकि उपरोक्त ईई से एक टिप्पणी ने मुझे पोर्टेबल जवाब दिया। अब मैं बक्षीस को संभालने के बारे में फाड़ा हूं। –

+0

उपरोक्त कोड पोर्टेबल है इस अर्थ में कि आप आसानी से विभिन्न ओएस संस्करणों को संभालने के लिए कोड ब्लॉक लिख सकते हैं। यदि आपको केवल विंडोज 7 के लिए इस फिक्स की आवश्यकता है, तो ऊपर दिया गया कोड वह है जो आप चाहते हैं। – Thorn

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