【问题标题】:Python SocketServer Listen on MulticastPython SocketServer 监听多播
【发布时间】:2012-09-03 15:48:46
【问题描述】:

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

有人能做到吗?

任何见解将不胜感激!

谢谢

【问题讨论】:

    标签: python multicast socketserver


    【解决方案1】:

    这行得通。我可以验证 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】:

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

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

      【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 2011-06-30
      • 2012-02-06
      • 2022-08-19
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多