Python SocketServer侦听多播

时间:2012-09-10 18:28:19

标签: python multicast socketserver

我一直在寻找一种方法让SocketServer python模块监听多播但没有成功。

有人设法这样做了吗?

非常感谢任何见解!

由于

3 个答案:

答案 0 :(得分:2)

文档(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套接字选项来侦听多播流量。

看起来您可能需要推出自己的多播服务器。

答案 1 :(得分:2)

这很有效。我可以验证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))

答案 2 :(得分:0)