在 macOS 上从单个网络接口接收组播 UDP 数据包

Receiving multicast UDP packets from a single network interface on macOS

这是一个 macOS 问题。我正在尝试设置一个 UDP 套接字来接收发送到多播地址的 SSDP 消息,即 UDP 数据包。我想限制从单个网络接口接收这些数据包。

我试过了

int fd = socket(AF_INET, SOCK_DGRAM, 0);  
char* itf = "en0";
int res = setsockopt(fd, SOL_SOCKET, IP_RECVIF, itf, strlen(itf));

setsockopt 调用失败 errno 42(协议不可用)。 我还发现 SO_BINDTODEVICE 可以用于相同的目的,但似乎在 macOS 上不可用。

使用绑定端口和地址也不起作用。然后在该套接字上没有收到发送到多播地址的数据包。

来自 OSX documentation on IP multicast...

A host must become a member of a multicast group before it can receive datagrams sent to the group. To join a multicast group, use the IP_ADD_MEMBERSHIP option...

要在特定接口上接收多播流量,您需要告诉 OS 您想要加入该多播组。按照以下步骤操作(您就快完成了)...

  1. 创建数据报套接字(完成)。
  2. 使用预期的端口绑定到 INADDR_ANY
  3. 通过 setsockopt() 使用 IP_ADD_MEMBERSHIP 选项加入多播组。您可以在此处传递您希望在 ip_mreq 结构中接收多播流量的特定网络接口的 IP 地址。