मेरे पास कुछ हद तक अजीब आवश्यकता है कि जावा से कई नेटवर्क इंटरफेस को लिनक्स मशीन पर सुन सकें और यह निर्धारित करें कि उनमें से एक को यूडीपी पैकेट प्राप्त होता है या नहीं खास प्रकार का। आउटपुट डेटा जो मुझे चाहिए, इंटरफ़ेस का आईपी पता प्रश्न में है। जावा में ऐसा करने का कोई तरीका है?लिनक्स पर जावा: एक बाध्य स्थानीय पते पर संदेशों को प्रसारित करने के लिए सुनना
वाइल्डकार्ड पता (नया डेटाग्राम सॉकेट (पोर्ट)) पर सुनना मदद नहीं करता है क्योंकि मुझे ब्रॉडकास्ट पैकेट मिलने पर, मैं इंटरफ़ेस के स्थानीय आईपी पते को निर्धारित नहीं कर सकता। किसी निश्चित इंटरफ़ेस (नए डेटाग्राम सॉकेट (पोर्ट, पता) से बाध्य होने पर प्रसारण को सुनना) को पैकेट प्राप्त नहीं होते हैं। इस मामले में एक कोड उदाहरण के हकदार है जो दिखाता है कि मैं क्या करने की कोशिश कर रहा हूँ:
Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) interfaces.nextElement();
Enumeration addresses = ni.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress address = (InetAddress)addresses.nextElement();
if (address.isLoopbackAddress() || address instanceof Inet6Address)
continue; //Not interested in loopback or ipv6 this time, thanks
DatagramSocket socket = new DatagramSocket(PORT, address);
//Try to read the broadcast messages from socket here
}
}
मैं भी इंटरफ़ेस का असली आईपी और बाकी की शुरुआत के आधार पर निर्माण किया प्रसारण पते के साथ सॉकेट प्रारंभ करने की कोशिश की सही नेटमास्क के अनुसार:
byte [] mask = { (byte)255, 0, 0, 0 };
byte[] addrBytes = InetAddress.getByName("126.5.6.7").getAddress();
for (int i=0; i < 4; i++) {
addrBytes[i] |= ((byte)0xFF)^mask[i];
}
InetAddress bcastAddr = InetAddress.getByAddress(addrBytes);
यह डेटाग्राम सॉकेट बनाने के दौरान बस एक बाइंड अपवाद फेंकता है।
संपादित करें: BindException (java.net.BindException: अनुरोध पता निर्दिष्ट नहीं कर सकते) एक प्रसारण-पता (126.255.255.255 जैसे) के साथ DatagramSocket के निर्माता को कॉल करने से केवल नवीनतम Ubuntu 9.04 (शायद नहीं उबंटू, लेकिन गिरी के साथ आता है हालांकि अलग-अलग मुद्दे)। उबंटू 8.10 के साथ यह काम करता है, साथ ही साथ Red Hat रिलीज (RHEL 4.x) के साथ मैं काम कर रहा हूं।
जाहिर है कि एक निश्चित स्थानीय आईपी से बंधे हुए पैकेट प्राप्त नहीं कर रहे हैं correct behaviour, हालांकि विंडोज़ में यह काम करता है। मुझे इसे लिनक्स (आरएचईएल और उबंटू) पर काम करने की ज़रूरत है। निम्न-स्तरीय सी-कोड के साथ एक वर्कअराउंड सेटॉकॉप (SO_BINDTODEVICE) है जिसे मैं जावा-एपीआई में नहीं ढूंढ सकता। This बिल्कुल मेरे आशावाद के साथ फट नहीं है, हालांकि :-)
ऐसा लगता है कि उस बग को 10 वर्षों में तय नहीं किया गया है !! पागल! : डी –