使用相同的套接字发送和接收 UDP 多播数据包

Rud*_*lis 3 c sockets posix multicast multicastsocket

我找不到一个工作示例,所以我将发布一个问题(让我们看看是否可以将其简化为 MVP 代码示例)。所以,我需要做 mdns 查询,我可以使用两个套接字(一个用于发送/第二个用于接收),但到目前为止我还无法使其与单个套接字一起工作。

所以我正在执行的步骤是:

枚举主机上的所有接口地址。然后对于每个主机:

  1. 创建非阻塞 UDP 套接字
  2. bind() 到接口地址:5353 或多播组地址(这些都会导致读取或写入失败)
  3. 将 IP_MULTICAST_IF 设置为本地接口
  4. IP_ADD_MEMBERSHIP 到多播组
  5. 在 kqueue 中添加用于读/写的套接字

因此,根据我在第 2 步中执行的操作,读取或写入失败:

  1. 如果我将套接字绑定到多播组,我会从 kqueue 收到读取通知并可以读取数据包,但是当我从 kqueue 收到写入通知并尝试写入时,它会失败并显示 errno 49
  2. 如果我将套接字绑定到接口地址,我可以发送数据包,但没有读取通知从 kqueue 到达

那么我需要绑定到哪个地址呢?另外,由于IP_ADD_MEMBERSHIP参数ip_mreq有接口字段,我真的需要IP_MULTICAST_IF吗?

dbu*_*ush 5

如果您绑定到特定的接口地址(至少在 Linux 上),您将无法接收多播。如果绑定到多播地址,则无法发送。

您需要做的是绑定到INADDR_ANY,然后当您设置该IP_ADD_MEMBERSHIP选项时,您将设置要在其上接收多播数据包的接口地址。如果您有多个接口,则可以为要绑定到的每个接口调用此方法。