我目前有以下代码接收组播数据。
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的邮件。如何在任何网卡上收听所有组播消息?没有硬编码。
答案 0 :(得分:2)
struct ip_mreq
允许您选择一个接口加入您想要的多播组。指定INADDR_ANY
允许系统通过在路由表中查找匹配路由上的接口来为您执行此操作(这意味着任何接口,而不是所有接口)。如果您使用的是Unix,则可以通过netstat -ng
查看为组成员身份选择了哪个界面。
如果要在所有接口上加入相同的组,请使用if_nameindex(3)
枚举它们(您必须弄清楚如何在Python中执行此操作),创建每个接口的套接字bind(2)
并使用接口索引或地址加入(setsockopt(2)
)组,然后使用select
轮询套接字。
答案 1 :(得分:2)
UDP套接字上没有“侦听”。这是一个TCP术语。您需要通过所有适用的接口加入多播组,通过循环它们。这确保了IGMP JOIN消息被发送到所有必需的网络,因此他们知道向您发送多播。
根据您的平台,您需要绑定到多播地址本身(Linux)或INADDR_ANY = 0.0.0.0(Windows)。我不确定Unix的阵营是什么,但我怀疑在这种情况下它是Windows阵营。这可以确保您可以通过任何界面接收数据报。