我一直在寻找一种方法让 SocketServer python 模块在没有成功的情况下监听多播。
有人设法这样做吗?
任何见解将不胜感激!
谢谢
我一直在寻找一种方法让 SocketServer python 模块在没有成功的情况下监听多播。
有人设法这样做吗?
任何见解将不胜感激!
谢谢
文档(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 套接字选项来侦听多播流量。
看起来您可能必须推出自己的多播服务器。
这行得通。我可以验证 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))