使用 IP_ADD_MEMBERSHIP 在新创建的接口上加入多播组

Joining to multicast groups on newly created interfaces with IP_ADD_MEMBERSHIP

我有一个 mDNS 响应器,它必须响应所有接口上的多播查询。

例如,在启动时,它使用 ethernet 接口将其套接字添加到多播组。

然后我连接到一个 VPN,一个新的 ppp 界面出现了。如何将我的套接字添加到新创建的接口以便能够响应它们?

示例:

  1. 我启动了我的 mDNS 响应程序。它创建一个 UDP 套接字并将其绑定到 INADDR_ANY (0.0.0.0)。然后套接字在 ethernet 接口上加入 mDNS 多播组 - 例如地址 224.0.0.251,接口 192.168.0.102.

  2. 我 运行 dig @224.0.0.251 hedgaron-debian-test.local -p 5353 并收到答复。

  3. 我连接到 VPN,正在创建一个新的 tun0 接口。

  4. 我再次 运行 dig @224.0.0.251 hedgaron-debian-test.local -p 5353 我的查询没有通过,因为(我猜)响应者的套接字没有加入多播组新创建的界面。 Ofc,这次dig从新界面进行查询。

注意:我听说 l2tp/ipsec VPN 不能与 ethernet 一起使用。也许这也是一个问题。

如何让套接字在所有接口上接受多播数据包?

我找到了解决办法。 l2tp/ipsec 不是问题。

套接字必须在 每个 接口上加入多组,而不仅仅是在 0.0.0.0 上。要在后台加入新创建的接口,应用程序必须启动一个线程,每 N 秒重新加入所有接口。

它允许套接字接受来自所有网络的多播数据包。