1

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

有人设法这样做吗?

任何见解将不胜感激!

谢谢

4

3 回答 3

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

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

于 2012-09-10T18:58:06.643 回答
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))
于 2012-12-17T16:32:30.927 回答
0

使用 UDPServer 类:

http://docs.python.org/library/socketserver.html#socketserver-udpserver-example

于 2012-09-10T18:55:56.600 回答