这是一个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 回答
来自OSX documentation on IP multicast ......
要在特定接口上接收多播流量,您需要告诉操作系统您要加入该多播组 . 按照这些步骤(你几乎在那里)......
创建数据报套接字(完成) .
与预期端口绑定到
INADDR_ANY
.使用
IP_ADD_MEMBERSHIP
选项通过setsockopt()
加入多播组 . 在这里,您可以传递希望在ip_mreq
结构中接收多播流量的特定网络接口的IP地址 .