套接字未加入多播组,但可以接收数据。

时间:2012-12-16 14:35:16

标签: c linux network-programming multicast

当我创建两个udp套接字并将它们绑定到INADDR_ANY和相同的端口号时。 但其中一人加入了一个组播组。 但是它们都可以从同一个组播组接收数据,即使其中一个套接字没有加入组播组。

2 个答案:

答案 0 :(得分:3)

Linux内核不跟踪IGMP连接的状态。 IGMP是路由器协议。将IGMP加入发送到多播组只是告诉路由器它应该将数据包转发到给定的地址和端口。请注意,路由器必须能够与IGMP通信。

这意味着虽然您使用setsockopt()加入了多播组,但内核不会按照您的预期跟踪每个套接字的成员资格。内核只是向路由器发送IGMP加入数据包。您可以使用wireshark或其他任何方式验证这一点。

由于内核不跟踪套接字的IGMP状态,该地址和端口上的传入流量只是内核的“常规”流量。

因此,如果您将两个套接字绑定到同一个地址和端口,然后使用该地址和端口发送了IGMP连接,那么这两个套接字上的数据包将是预期的行为。

BTW:为什么你需要两个套接字绑定到同一个地址和端口?

更新:根据@Ambroz Bizjak的解释(谢谢),Linux内核不跟踪IGMP连接的状态是不正确的。确实如此。但是,如果多个套接字绑定到同一个地址和端口,它不会使用此信息来决定应将哪些数据包转发到哪个套接字。

答案 1 :(得分:2)

内核根本不会根据套接字所属的组播组过滤传入的组播数据包。如果未向组添加套接字,则如果同一系统上的其他套接字是成员,则它仍可能会向组发送多播。 (我不确定如果多播到达会发生什么,但没有套接字是成员。你可以测试你是否愿意。)

请注意,实际上的内核跟踪组所有权,甚至是每个套接字。它必须或者无法正确实现IGMP协议的客户端。例如,内核需要回复来自路由器的各种IGMP查询(在那里询问主机加入哪些组),并且还知道在没有更多套接字连接到的情况下发送离开组消息。特定群体。