2010-10-04 17 views
11

शामिल रॉ सॉकेट प्रोग्रामिंग के लिए मैं कुछ मौजूदा सी कोड ICMP कच्चे सॉकेट का उपयोग करता है पिंग क्या करना है और मैं जावा ICMP संकुल का समर्थन नहीं करता के रूप में जावा में इस कोड का उपयोग करने की आवश्यकता है। जब मैं जेएनआई में कोड लपेटता हूं और इसे कॉल करता हूं, तो सी कोड करते समय सॉकेट प्राप्त करने में विफल रहता है:सबसे अच्छा तरीका है जावा

सॉकेट (AF_INET, SOCK_RAW, 1);

मुझे लगता है कि जावा कुछ विशेषाधिकार है कि जावा प्रक्रिया से कच्चे सॉकेट के उपयोग को निष्क्रिय गिरावट आई है। यह मुझे एक समाधान मिलना चाहिए।

मैं निम्नलिखित देखा है:

  • अगर मैं एक सी प्रोग्राम लिखने और रनटाइम काँटेदार कोड का उपयोग कर सॉकेट खोल सकता है जावा से फोन है कि।
  • यदि मैं ग्रहण से यह मूल कोड चलाता हूं तो यह अच्छी तरह से चलता है। मुझे लगता है कि यह इस तथ्य से आता है कि eclipse eclipse.exe से शुरू किया गया है, और java.exe से नहीं।

इसका मतलब है कि मैं इन दो रणनीतियों में से किसी एक को चुनकर अपनी समस्या का समाधान कर सकता हूं, लेकिन मुझे न तो पसंद है। क्या कोई और तरीका है कि मैं जावा को यह स्वीकार करने के लिए प्राप्त कर सकता हूं कि जेएनआई कोड इस सॉकेट को खोल रहा है?

संपादित करें: जितना अधिक मैं इस समस्या को देखता हूं, मुझे लगता है कि यह जावा 7 शुरू होने के साथ विंडोज 7 संबंधित समस्या होना चाहिए।

यह भी प्रतीत होता है कि अगर आप मिल व्यवहार करने के लिए खिड़कियों या यदि आप Windows की तुलना में कुछ अन्य मंच पर हैं विधि InetAddress.isReachable() के रूप में अच्छी तरह से इस्तेमाल किया जा सकता।

उत्तर

5

हो सकता है कि एक मौजूदा जावा देशी सॉकेट lib का उपयोग करें? तो आपको जेएनआई लिब को कोड करने के बारे में चिंता करने की ज़रूरत नहीं है।

देखें: http://www.savarese.com/software/rocksaw/

+0

यह पुस्तकालय बहुत अच्छा लगता है। हालांकि यह वही कर रहा है जैसे हमारे मूल कोड पहले से ही कर रहे हैं, इसलिए मेरी समस्या विंडोज़ से संबंधित होनी चाहिए। – Knubo

+0

हाँ, मुझे थोड़ा दर्दनाक होने के लिए जेएनआई पुस्तकालयों को लिखना मिल रहा है। तो, जब संदेह में - कुछ ऐसा उपयोग करें जो पहले से मौजूद है। क्या आपको यह lib lib 7 के साथ काम करने के लिए मिला है या यह भी असफल रहा है? – Andy

+0

हमने Runtime.exec() के साथ जाने का फैसला किया क्योंकि हमें इसे हल करना है और आगे बढ़ना है। मुझे लगता है कि आपका जवाब अब तक का सबसे अच्छा है और इसे वास्तव में मेरा प्रश्न हल करना चाहिए, हालांकि मेरी समस्या नहीं है इसलिए मैं इसे स्वीकार करूंगा :) – Knubo

0

साथ ही आप java.net.InetAddress.isReachable() विधि की कोशिश कर सकते, इस के बाद J2SE5 से उपलब्ध है।

लेकिन यह काम नहीं कर रहा Windows में अपेक्षा के अनुरूप। देखें: http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html

+0

यह विधि उपयोग के मामले के लिए उपयुक्त नहीं है जिसे हमें करने की आवश्यकता है, और हमें विंडोज़ पर भी काम करने की आवश्यकता है। – Knubo

+1

यह विधि केवल तभी कार्य करती है जब आपके पास रूट खाता अनुमति हो - यह इस तरह के मामले में कच्चे आईसीएमपी ईसीएचओ अनुरोध भेजता है, अन्यथा यह पोर्ट 7 (गूंज सेवा) पर टीसीपी कनेक्शन स्थापित करने का प्रयास करता है जो हमेशा खुला नहीं होता है। इसलिए, यह कुछ मामलों में विफल हो जाएगा, जब जावा रूट खाते से नहीं चलाया गया है। –

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