2011-03-31 13 views
7

पर बाँध मल्टीकास्ट उच्च और निम्न गूगल उनमें खोज करना मैं निम्नलिखित प्रश्न करने के लिए निश्चित जवाब नहीं मिला है के बाद: मोटे तौर पर निम्नलिखित गाइड का पालन करते हुए: http://twistedmatrix.com/documents/10.2.0/core/howto/udp.html#auto3अजगर मुड़ ढांचा विशिष्ट इंटरफ़ेस

यह कैसे संभव है मल्टीकास्ट श्रोता को पर घुमाएं केवल मल्टीकास्ट पता और विशिष्ट या सभी इंटरफेस पर।

रिएक्टर.लिस्टन पर देखकर मल्टीकास्ट यह हार्डवेयर इंटरफ़ेस के लिए केवल एक छद्म इंटरफ़ेस को आईपी पते द्वारा दर्शाया गया है। मुझे केवल मल्टीकास्ट पते पर बाध्य करने के लिए कोई तरीका नहीं मिल रहा है उदा। एक विशिष्ट इंटरफेस या सभी इंटरफेस के 224.0.0.1। क्या कोई इस पर और जानकारी प्रदान कर सकता है?

उत्तर

3

reactor.listenMulticasttwisted.internet.udp.MulticastPort ऑब्जेक्ट देता है। उस ऑब्जेक्ट का वह सॉकेट है जिसका आप सुन रहे हैं। तो reactor.listenMulticast के परिणाम पर लटकाएं और उपयुक्त सॉकेट विकल्प सेट करें (इस मामले में यह SO.BINDTODEVICE जैसा दिखता है) एक शून्य समाप्त डिवाइस स्ट्रिंग के साथ।

import IN, socket, struct 

udp_port = reactor.listenMulticast(8005, MulticastServerUDP()) 
dev = "eth0" + "\0" 
udp_port.socket.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, dev) 
reactor.run() 

यह अच्छा होगा अगर इस listenMulticast कॉल के माध्यम से सीधे संपर्क में आते थे, लेकिन इस संभालने काम करता है यह एक बहुत आसान पैच होगी। अगर यह आपकी समस्या हल करता है तो मुझे बताएं।

+2

और केवल निर्दिष्ट मल्टीकास्ट समूह के लिए बाध्यकारी के रूप में, आपको 'listenMulticast() 'के तीसरे तर्क के रूप में पास करना चाहिए। –

1

एक सरल, अगर भारी हाथ दृष्टिकोण बस की तरह कुछ के माध्यम से एक मार्ग निर्दिष्ट करने के लिए हो सकता है: (और शायद आसान)

sudo route add 239.255.0.0 -interface en0 -netmask 255.255.0.0 
3

अन्य उत्तर समस्या का समाधान हो सकता है, लेकिन वहाँ एक "अधिक मुड़" है एकाधिक इंटरफेस पर एक मल्टीकास्ट समूह को सुनने का तरीका।

एक या अधिक इंटरफेस

पर एक बहुस्त्र्पीय समूह को सुनना, एक या अधिक इंटरफेस पर एक बहुस्त्र्पीय समूह को सुनने के प्रोटोकॉल के transport.joinGroup को कई कॉल में प्रत्येक वांछित इंटरफेस के आईपी प्रदान करने के लिए() 'इंटरफ़ेस' तर्क के रूप में विधि।

नीचे एक उदाहरण है जो मेरे लिनक्स बॉक्स पर काम करता है, और आपके सिस्टम को विशिष्ट इंटरफेस पर मल्टीकास्ट्स को सुन देगा। आईपी ​​पते को अपने सिस्टम से संबंधित लोगों के साथ बदलें।

#!/usr/bin/env python 

from twisted.internet import protocol 
from twisted.internet import reactor 

class MyProtocol(protocol.DatagramProtocol): 
    def startProtocol(self): 
     # Join a multicast group, 224.0.0.9, on the interface belonging 
     # to each of these IPs. 
     # XXX Replace the interface_ips with one or more IP addresses belonging 
     # to your system. 
     for interface_ip in ["192.168.2.2", "10.99.1.100"]: 
      self.transport.joinGroup("224.0.0.9", interface_ip) 

if __name__ == "__main__": 
    reactor.listenMulticast(1520, MyProtocol()) 
    reactor.run() 

आप देख सकते हैं कि इंटरफ़ेस /sbin/ip maddr show आदेश का उपयोग कर नए बहुस्त्र्पीय समूह के लिए सुन रहा है। आदेश आउटपुट में वांछित इंटरफ़ेस नाम खोजें, और सत्यापित करें कि मल्टीकास्ट समूह इसके नीचे दिखाई देता है।

मूल पोस्ट में लिंक किया गया यूडीपी सर्वर उदाहरण उपरोक्त के रूप में दूसरा आईपी पता तर्क शामिल करने के लिए समूह समूह() में कॉल को बदलकर एक ही चीज़ करने में सक्षम होना चाहिए। कई इंटरफेस से बाहर संभवतः -

किसी विशेष IP

से multicasts भेजा जा रहा है आप एक सॉकेट पर बहुस्त्र्पीय डेटा मिल रहा है तो संभावना है कि आप भी बहुस्त्र्पीय डेटा भेजने के लिए चाहते हैं कर रहे हैं। चूंकि यह निकटता से संबंधित है और इसके आसपास बहुत कम उदाहरण हैं, मैं इसे यहां फेंक दूंगा। Twisted.internet.protocol.DatagramProtocol ऑब्जेक्ट के अंदर आप self.transport.setOutgoingInterface() विधि का उपयोग स्रोत आईपी को नियंत्रित करने के लिए कर सकते हैं जिसका उपयोग बाद के कॉल के लिए self.transport.write() पर किया जाएगा।उदाहरण एकाधिक आईपी/इंटरफेस से संदेश भेजना दिखा रहा है:

class MyProtocol(protocol.DatagramProtocol): 
    # ... 
    def send_stuff(self, msg): 
     for src_ip in ["10.0.0.1", "192.168.1.1"]: 
      self.transport.setOutgoingInterface(src_ip) 
      self.transport.write(msg, ("224.0.0.9", 1520)) 

मान लीजिए कि इन आईपी को दो अलग-अलग इंटरफेस सौंपा गया था। वायर्सहार्क के साथ घूमते हुए आप पहले इंटरफेस से भेजे गए संदेश को देखेंगे, फिर दूसरा इंटरफ़ेस, प्रत्येक आईपी का उपयोग संबंधित ट्रांसमिशन के लिए स्रोत आईपी पते के रूप में करेगा।

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