私は、成功せずにマルチキャストで SocketServer python モジュールをリッスンする方法を見つけるために探し回っています。
誰でもそうすることができましたか?
どんな洞察も大歓迎です!
ありがとう
私は、成功せずにマルチキャストで SocketServer python モジュールをリッスンする方法を見つけるために探し回っています。
誰でもそうすることができましたか?
どんな洞察も大歓迎です!
ありがとう
これは機能します。IGMP が送信され、マルチキャストが受信されることを確認できます。注意すべき重要なことは、マルチキャストが必要な場合は、UDPServer を任意にバインドし、スレッドを開始して (server.socket が作成されるように)、マルチキャスト メンバーシップを追加することです。
class MessageListenerUDP(SocketServer.ThreadingMixIn, SocketServer.UDPServer): pass
if LISTEN_UDP:
if MULTICAST: server=MessageListenerUDP(('',PORT), MessageHandlerUDP)
else: server=MessageListenerUDP((LISTEN_UDP,PORT), MessageHandlerUDP)
server_thread=threading.Thread(target=server.serve_forever)
server_thread.start()
if MULTICAST:
server.socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
struct.pack("=4sl", socket.inet_aton(LISTEN_UDP), socket.INADDR_ANY))
ドキュメント (http://docs.python.org/library/socketserver.html) は、マルチキャストとソース コード (http://hg.python.org/cpython/file/2.7/Lib) について言及していません。 /SocketServer.py) は、マルチキャスト リスナー (例: socket.IP_ADD_MEMBERSHIP) で表示されると予想されるソケット オプションを設定しないため、SocketServer はマルチキャストをサポートしていないと言えます。
UDPServer を作成しようとしていて、次のようなエラーが発生していると思います (発生しているエラーにコード スニペットを含めるようにしてください)。
socket.error: [Errno 10049] The requested address is not valid in its context
これは、UDPServer が TCPServer のサブクラスであり、TCPServer が作成されると、指定されたアドレスで bind() を呼び出すためです。ただし、リッスンするためにマルチキャストアドレスにバインドすることは想定されていません(したがってエラーです)。IP_ADD_MEMBERSHIPソケットオプションを使用して、マルチキャストトラフィックをリッスンします。
独自のマルチキャスト サーバーを展開する必要があるようです。
UDPServer クラスを使用します。
http://docs.python.org/library/socketserver.html#socketserver-udpserver-example