这是一个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上不可用。
使用绑定端口和地址也不起作用。然后,在该套接字上没有收到发送到多播地址的数据包。
答案 0 :(得分:1)
来自OSX documentation on IP multicast ...
主机必须先成为多播组的成员才能接收发送给该组的数据报。要加入多播组,请使用IP_ADD_MEMBERSHIP选项...
要在特定接口上接收多播流量,您需要告诉操作系统您要加入该多播组。按照以下步骤(你几乎就在那里)......
INADDR_ANY
。setsockopt()
选项通过IP_ADD_MEMBERSHIP
加入多播组。在这里,您可以在ip_mreq
结构中传递您希望接收多播流量的特定网络接口的IP地址。