首页 文章

在多个网络上侦听多播流量

提问于
浏览
1

我目前有以下代码接收组播数据 .

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', 24003))
mreq = struct.pack("=4sl", socket.inet_aton("238.210.10.1"), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

我有两个网卡,但代码只监听发送到127.0.0.1的消息 . 如何在任何网卡上收听所有组播消息?没有硬编码 .

2 回答

  • 2

    struct ip_mreq允许您选择一个接口加入您想要的多播组 . 指定 INADDR_ANY 允许系统通过查找路由表中匹配路由上的接口(它表示任何接口,而不是所有接口)为您执行此操作 . 如果您使用的是Unix,则可以使用netstat -ng查看为组成员身份选择了哪个界面 .

    如果你想在所有接口上加入同一个组,那么用if_nameindex(3)枚举它们(你必须弄清楚如何在Python中执行此操作),为每个接口创建一个套接字,使用接口加入( setsockopt(2) )组索引或地址,然后使用 select 轮询套接字 .

  • 2
    • UDP套接字上没有'listening' . 这是一个TCP术语 . 您需要通过循环遍历所有适用的接口加入组播组 . 这确保了IGMP JOIN消息被发送到所有必需的网络,因此他们将知道向您发送多播 .

    • 根据您的平台,您需要绑定到多播地址本身(Linux)或INADDR_ANY = 0.0.0.0(Windows) . 我不确定Unix的阵营是什么,但我怀疑在这种情况下它是Windows阵营 . 这可确保您可以通过任何界面接收数据报 .

相关问题