2012-09-04 21 views
6

को सॉकेट सेट करते समय ब्रॉडकास्ट किए गए पैकेट प्राप्त करना dgram.createSocket('udp4'); के माध्यम से सॉकेट सेट करते समय और इसे किसी विशिष्ट पोर्ट पर बाध्य नहीं करते हैं, मुझे ब्रॉडकास्ट किए गए पैकेट प्राप्त होते हैं जिन्हें 255.255.255.255 पर भेजा गया था, लेकिन जब मैं एक ही सॉकेट को बाध्य कर रहा हूं मेरे इंटरफ़ेस का विशिष्ट आईपी this.server.bind(67, host); मुझे इन ब्रॉडकास्ट किए गए पैकेट नहीं मिलेगा। क्या यह एक सामान्य व्यवहार है?एक विशिष्ट पोर्ट

उत्तर

4

Javadoc for java.net.DatagramSocket का कहना है:

आदेश प्रसारण प्राप्त करने के लिए पैकेट DatagramSocket वाइल्डकार्ड का पता करने के लिए बाध्य किया जाना चाहिए। कुछ कार्यान्वयन में, प्रसारण पैकेट भी प्राप्त किया जा सकता है जब डेटाग्राम सॉकेट अधिक विशिष्ट पता से जुड़ा होता है।

यह एक स्पष्ट स्पष्ट संकेत है कि व्यवहार मंच-निर्भर है, इसलिए जावास्क्रिप्ट सॉकेट उसी तरह से पीड़ित होंगे।

मेरे परीक्षण के मुताबिक, विंडोज विस्टा 64 दूसरे वाक्य में वर्णित व्यवहार नहीं करता है (यानी INADDR_ANY तक बाध्य होने तक प्रसारण प्राप्त नहीं होता है)।

+0

-1 चूंकि इस प्रश्न का जावा के साथ कुछ लेना देना नहीं है। –

+2

@RobRaisch और आप भी एक मजेदार -1।यदि आपने मेरा जवाब सही तरीके से पढ़ा था, तो आपने देखा होगा कि मैं जावाडोक * का सबूत के रूप में उद्धृत कर रहा था कि व्यवहार मंच-निर्भर है, और इसलिए यह जावास्क्रिप्ट को भी प्रभावित करता है, और वास्तव में अन्य सभी भाषाओं को समान रूप से प्रभावित करता है। शर्मिंदा आपको पहली बार नहीं मिला। – EJP

2

हाँ, यह अपेक्षित व्यवहार क्योंकि, एक बंदरगाह या इंटरफेस, dgram.createSocket() होगा बिना:

एक यादृच्छिक बंदरगाह पर "सभी इंटरफ़ेस" पता करने के लिए बाँध (यह सही करता है udp4 और udp6 सॉकेट दोनों के लिए चीज)।

- nodejs.org

जो आपको किसी भी उपलब्ध इंटरफेस पर किसी भी बंदरगाह के लिए प्रसारण पैकेट पर कब्जा करने की अनुमति देता है पर dgram API documentation से।

बनाने के लिए एक इंटरफ़ेस और पोर्ट प्रदान करना सॉकेट() आपको निर्दिष्ट पोर्ट पर निर्दिष्ट इंटरफ़ेस से जुड़े नेटवर्क पर प्रसारित किए गए पैकेट को केवल कैप्चर करने के लिए प्रतिबंधित करता है।

आपको ध्यान रखना चाहिए कि एक विशिष्ट इंटरफ़ेस में प्रसारण प्राप्त करने के लिए, उन्हें उस नेटवर्क पर/उस नेटवर्क के प्रसारण पते पर भेजा जाना चाहिए, जो कि इंटरफ़ेस सेवा करता है।

इसलिए यदि आपके नेटवर्क है:

255.255.255.252 

जो भी है:

10.1.1.0/29 (CIDR notation) 

सही प्रसारण का पता है:

10.1.1.7 

10.1.1.0 
के नेटमास्क साथ

अपने नेटवर्क पते और नेटमास्क को देखते हुए, tuxgraphics.org का "Network and IP address calculator" एक ऐसा टूल है जिसका उपयोग आप अपने विशिष्ट नेटवर्क के लिए सही प्रसारण पता पहचानने के लिए कर सकते हैं।

+1

व्यवहार वास्तव में मंच-निर्भर है। उदाहरण के लिए स्टीवंस, फेनर, और रूडोल्फ, * यूनिक्स नेटवर्क प्रोग्रामिंग, * वॉल्यूम I, तीसरा संस्करण, पी। 532, और # 3.3.6 आरएफसी 11 9 2 जो इस मुद्दे पर 'कोई खड़ा नहीं है'। – EJP