在Python中选择多播网络接口

6 投票
4 回答
11875 浏览
提问于 2025-04-16 04:59

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

4 个回答

1

在给你的套接字绑定时,可以尝试这里提到的值:这里

对于IPv4地址,有两种特殊的形式可以代替主机地址:空字符串表示INADDR_ANY,而字符串''表示INADDR_BROADCAST。

INADDR_ANY也被称为通配符地址:

使用通配符本地地址的套接字可以接收发送到指定端口号的消息,这些消息可以发给主机上任何可能的地址。

更多信息可以查看这里

13

我建议你不要使用 INADDR_ANY。在实际的多播环境中,你需要对你的多播套接字非常具体,不想像发送 igmp 加入请求到所有接口那样做。这会导致一些临时的解决办法,比如在某些系统上需要使用“route add -host 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 中,你也可以使用 '' 代替地址字符串,但我不推荐这样做。如果使用 '',如果有另一个套接字使用相同的端口,这两个套接字会互相接收到对方的数据。

0

我搞明白了。原来我之前漏掉的部分是要把接口添加到用于加入多播组的mreq结构里。

撰写回答