मुझे इसके लिए एक कामकाजी उदाहरण नहीं मिला, इसलिए मैं एक प्रश्न पोस्ट करने जा रहा हूं (और देखते हैं कि क्या मैं इसे एमवीपी कोड उदाहरण में कम कर सकता हूं)। तो, मुझे एमडीएनएस प्रश्न करने की ज़रूरत है, मैं दो सॉकेट (एक भेजने/प्राप्त करने के लिए दूसरा) का उपयोग कर सकता हूं लेकिन अभी तक मैं इसे एक सॉकेट के साथ काम करने में सक्षम नहीं हूं।

तो मैं जो कदम उठा रहा हूं वे हैं:

होस्ट पर सभी इंटरफ़ेस पतों की गणना करें। फिर प्रत्येक मेजबान के लिए:

  1. एक गैर-अवरुद्ध यूडीपी सॉकेट बनाएं
  2. बाइंड () या तो इंटरफ़ेस पते पर: 5353 या मल्टीकास्ट समूह का पता (इनमें से कोई भी कारण या तो विफल होने के लिए पढ़ें या लिखें)
  3. IP_MULTICAST_IF को स्थानीय इंटरफ़ेस पर सेट करें
  4. मल्टीकास्ट समूह में IP_ADD_MEMBERSHIP
  5. kqueue में पढ़ने/लिखने के लिए सॉकेट जोड़ें

तो चरण 2 में मैं जो करता हूं उसके आधार पर या तो पढ़ना या लिखना विफल रहता है:

  1. अगर मैं मल्टीकास्ट समूह में सॉकेट को बांधता हूं तो मुझे क्यूक्यू से सूचनाएं मिलती हैं और पैकेट पढ़ सकते हैं, लेकिन जब मुझे केक्यू से एक लिखित अधिसूचना मिलती है और इसे लिखने की कोशिश की जाती है तो यह त्रुटि 49 के साथ विफल हो जाती है
  2. अगर मैं इंटरफ़ेस पते पर सॉकेट को बांधता हूं तो मैं पैकेट भेज सकता हूं लेकिन kqueue से कोई भी पठन अधिसूचना कभी नहीं आती है

तो फिर मुझे किस पते से जुड़ना होगा? साथ ही, चूंकि IP_ADD_MEMBERSHIP पैरामीटर ip_mreq में इंटरफ़ेस फ़ील्ड है, क्या मुझे वास्तव में IP_MULTICAST_IF की आवश्यकता है?

3
Rudolfs Bundulis 26 मार्च 2020, 22:04

1 उत्तर

सबसे बढ़िया उत्तर

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

आपको INADDR_ANY से जुड़ना है, फिर जब आप IP_ADD_MEMBERSHIP विकल्प सेट करते हैं, तो आप इंटरफ़ेस पता सेट करते हैं, जिस पर आप मल्टीकास्ट पैकेट प्राप्त करना चाहते हैं। यदि आपके पास एकाधिक इंटरफ़ेस हैं, तो आप इसे प्रत्येक इंटरफ़ेस के लिए कॉल कर सकते हैं जिसे आप बाध्य करना चाहते हैं।

5
dbush 26 मार्च 2020, 19:10