在 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 您想要加入该多播组。按照以下步骤操作(您就快完成了)...
- 创建数据报套接字(完成)。
- 使用预期的端口绑定到
INADDR_ANY
。
- 通过
setsockopt()
使用 IP_ADD_MEMBERSHIP
选项加入多播组。您可以在此处传递您希望在 ip_mreq
结构中接收多播流量的特定网络接口的 IP 地址。
这是一个 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 您想要加入该多播组。按照以下步骤操作(您就快完成了)...
- 创建数据报套接字(完成)。
- 使用预期的端口绑定到
INADDR_ANY
。 - 通过
setsockopt()
使用IP_ADD_MEMBERSHIP
选项加入多播组。您可以在此处传递您希望在ip_mreq
结构中接收多播流量的特定网络接口的 IP 地址。