我一直在寻找一种方法让SocketServer python模块监听多播但没有成功。
有人设法这样做了吗?
非常感谢任何见解!
由于
答案 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)