代码之家  ›  专栏  ›  技术社区  ›  CoreyD

在python中选择多播网络接口

  •  6
  • CoreyD  · 技术社区  · 14 年前

    我有一台服务器,有两个独立的以太网连接。当我在python中绑定套接字时,它默认为两个网络中的一个。如何从Python中的第二个网络中提取多播流?我试过在第二个网络上使用服务器的IP地址调用bind,但没有成功。

    3 回复  |  直到 14 年前
        1
  •  12
  •   Ian    14 年前

    我建议你不要用任何地址。在生产多播环境中,您希望对多播套接字非常具体,并且不希望执行诸如发送IGMP加入所有接口之类的操作。这会导致黑客工作解决方案,当事情不工作时,如“路由添加-主机239.1.1.1 dev eth3”,以获得正确的多播连接取决于所讨论的系统。改为使用:

    def joinMcast(mcast_addr,port,if_ip):
        """
        Returns a live multicast socket
        mcast_addr is a dotted string format of the multicast group
        port is an integer of the UDP port you want to receive
        if_ip is a dotted string format of the interface you will use
        """
    
        #create a UDP socket
        mcastsock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
        #allow other sockets to bind this port too
        mcastsock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    
        #explicitly join the multicast group on the interface specified
        mcastsock.setsockopt(socket.SOL_IP,socket.IP_ADD_MEMBERSHIP,
                    socket.inet_aton(mcast_addr)+socket.inet_aton(if_ip))
    
        #finally bind the socket to start getting data into your socket
        mcastsock.bind((mcast_addr,port))
    
        return mcastsock
    

    在mcastsock.bind中,您也可以使用“”而不是地址字符串,但我建议不要这样做。对于“”,如果您有另一个使用相同端口的套接字,则两个套接字将获取彼此的数据。

        2
  •  1
  •   Idan K    14 年前

    什么时候? bind 使用您的套接字,尝试上面提到的值 here :

    对于IPv4地址,有两种特殊形式 接受而不是主机 地址:空字符串表示 和字符串 “代表” InAddr_广播。

    INADDR_ANY 也称为通配符地址:

    具有通配符本地地址的套接字可以接收指向指定端口号并指向分配给主机的任何可能地址的消息。`

    更多 here .

        3
  •  0
  •   CoreyD    14 年前

    我明白了。结果发现,我缺少的是将接口添加到用于向多播组添加成员身份的mreq结构中。