【发布时间】:2012-09-03 15:48:46
【问题描述】:
我一直在寻找一种方法让 SocketServer python 模块监听多播但没有成功。
有人能做到吗?
任何见解将不胜感激!
谢谢
【问题讨论】:
标签: python multicast socketserver
我一直在寻找一种方法让 SocketServer python 模块监听多播但没有成功。
有人能做到吗?
任何见解将不胜感激!
谢谢
【问题讨论】:
标签: python multicast socketserver
这行得通。我可以验证 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 不支持多播。
我假设(您应该尝试在您遇到的错误中包含一个代码 sn-p)您正在尝试创建一个 UDPServer 并且您收到类似于以下内容的错误:
socket.error: [Errno 10049] The requested address is not valid in its context
这是因为 UDPServer 是 TCPServer 的子类,当创建 TCPServer 时,它会在指定地址上调用 bind()。您不应该绑定到多播地址以进行侦听(因此出现错误),您使用 IP_ADD_MEMBERSHIP 套接字选项来侦听多播流量。
看起来您可能必须推出自己的多播服务器。
【讨论】:
【讨论】: