2011-06-16 15 views
12

मैं एक सी ++ सर्वर/.NET क्लाइंट अनुप्रयोग जोड़े पर काम कर रहा हूं जिसमें मेरा सर्वर (जो लिनक्स पर सी ++ चलाता है) पूरे नेटवर्क पर यह जीवित दिखाने के लिए एक संदेश प्रसारित करता है और मेरा .NET प्रोग्राम पैकेट और पार्स के लिए सुनता है सर्वर का अपटाइम।नेटवर्क यूडीपी प्रसारण डिजाइन?

जैसा कि मैंने पढ़ा है, प्रसारण पते पर नियमित यूडीपी प्रसारण भेजने के लिए, मुझे बस 1 9 2.168.0.255 (मेरे मामले में 1 9 2.168.2.255) या 255.255.255.255 पर एक पैकेट भेजना है। क्या यह सही है? क्या मैं उसी पोर्ट पते का उपयोग कर सकता हूं? क्या कोई और आवश्यकता है?

मैं इस तथ्य को समझता हूं कि यदि मेरा .NET प्रोग्राम उस विशेष पते पर सुनता है तो मेरे सी ++ सर्वर प्रोग्राम की तुलना में अन्य अनुप्रयोगों से पैकेट प्राप्त करना संभव है। क्या मेरे .NET प्रोग्राम को पैकेट के शीर्षलेख को पढ़ने के लिए सी ++ सर्वर-साइड पर पैकेट पर "हस्ताक्षर" करने का कोई तरीका है और यह देखें कि यह (लगभग) जिसे मैं ढूंढ रहा हूं?

उत्तर

20

भाषा का प्रयोग कर रहे है के बावजूद, यहां मेरे जवाब है:

प्रसारण आईपी पते के संबंध में, दोनों पते प्रसारण पते हैं लेकिन सीमित प्रसारण पता (जो 255.255.255.255 है) को राउटर द्वारा अग्रेषित नहीं किया जाएगा। सबनेट-निर्देशित प्रसारण पता (1 9 2.168.2.255) का उपयोग करना बेहतर है।

प्रसारण पता भेजने/प्राप्त करने के लिए, आपको अपना प्रसारण पता (प्रसारण आईपी पता और पोर्ट नंबर) परिभाषित करने की आवश्यकता है।

int enabled = 1; 
setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &enabled, sizeof(enabled)); 

जहां sockfd सॉकेट की जानकारी देता है: उदाहरण के लिए: के रूप में निम्नानुसार 192.168.2.255 और पोर्ट संख्या 3000 क्लाइंट अनुप्रयोग (प्रेषकों) चाहिए SO_BROADCAST सॉकेट विकल्प सक्षम करें।

सर्वर एप्लिकेशन एक विशिष्ट पोर्ट नंबर (पोर्ट 3000) पर सुनेंगे। आम तौर पर, सर्वर यूनिकास्ट संदेश का उपयोग करके प्रत्येक अनुरोध का जवाब देगा।

तब तक कोई संघर्ष नहीं होगा जब तक कि एक ही पोर्ट नंबर पर कोई एप्लिकेशन नहीं सुन रहा हो। यदि आपका सर्वर एक ही पोर्ट पर तब तक सुन रहा है जब तक कि आप SO_REUSEADDRESS सॉकेट विकल्प सक्षम नहीं करते हैं, तो आपका सर्वर नहीं चलेगा। हालांकि, यदि कोई संघर्ष है, तो आपका हस्ताक्षर आपके प्रोटोकॉल (संदेश प्रारूप) के आधार पर है। तो, संदेश प्रारूप की जांच करें और संदेश को अस्वीकार करें यदि यह आपके एप्लिकेशन प्रोटोकॉल द्वारा परिभाषित संदेश प्रारूप का पालन नहीं करता है।

क्लाइंट अनुप्रयोगों के लिए, प्राप्त पैकेट यूनिकास्ट है (जब तक कि आपके पास कोई अन्य डिज़ाइन न हो)। तो, इस तरफ कोई संघर्ष नहीं है।

+0

तो, मूल रूप से, ग्राहक पक्ष पर, मैं स्थानीय आईपी पर पोर्ट एक्स के लिए सुनता हूं? –

2

यदि आपका .NET प्रोग्राम प्रसारण यातायात के लिए सुनता है, तो उसे उस पोर्ट पर भेजे गए नेटवर्क पर किसी भी और सभी प्रसारण ट्रैफ़िक प्राप्त होंगे, जिसमें आपके सर्वर द्वारा भेजा गया ट्रैफ़िक भी शामिल नहीं है। आप अपने सर्वर द्वारा भेजे गए प्रसारण संदेशों के पेलोड में "मार्कर" डाल सकते हैं। इस तरह, आपका .NET प्रोग्राम अंतर कर सकता है कि किसके बारे में परवाह है।

इसके अलावा, मैं प्रसारण के बजाए मल्टीकास्ट का उपयोग करने की सलाह दूंगा। ब्रॉडकास्ट यातायात आमतौर पर एक ही सबनेट पर मेजबान तक ही सीमित होता है। आम आदमी के शब्दों में, यदि आपके नेटवर्क में राउटर है, तो राउटर के किनारे ए पर एक होस्ट को मेजबान बी (और इसके विपरीत) पर होस्ट द्वारा भेजे गए प्रसारण ट्रैफ़िक को नहीं देखा जाएगा क्योंकि राउटर इसे "ब्लॉक" करता है। अगर मेजबान मल्टीकास्ट समूह में शामिल हो जाता है तो रूटर लगभग हमेशा मल्टीकास्ट ट्रैफिक को आगे बढ़ाएंगे।

7

तुम भी, प्रसारण यातायात भेजने के लिए C++ SO_BROADCAST सॉकेट विकल्प को सक्षम करने के लिए है या आप एक अनुमति नहीं दी त्रुटि मिलेगी:

int broadcastPermission = 1; 
setsockopt(socketDescriptor, SOL_SOCKET, SO_BROADCAST, (void*)&broadcastPermission, sizeof(broadcastPermission)) 
संबंधित मुद्दे