从macOS上的单个网络接口接收多播UDP数据包

时间:2017-09-29 07:49:55

标签: c macos network-programming udp multicast

这是一个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上不可用。

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

1 个答案:

答案 0 :(得分:1)

来自OSX documentation on IP multicast ...

  

主机必须先成为多播组的成员才能接收发送给该组的数据报。要加入多播组,请使用IP_ADD_MEMBERSHIP选项...

要在特定接口上接收多播流量,您需要告诉操作系统您要加入该多播组。按照以下步骤(你几乎就在那里)......

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