Sockets 如何在所有连接的网络上发送UDP多播?
我有三个网络接口(在我的窗口7下) 我有UDP套接字(AF_INET),它没有通过bind调用绑定到任何addr 我尝试将数据报发送到239.255.255.250。正如我在Wireshark中看到的,只有192.168.139.1源地址用于通过192.168.139.0/24网络发送数据报 我想我需要告诉winsock它必须从哪个接口发送数据报,并尝试调用setsockopt:Sockets 如何在所有连接的网络上发送UDP多播?,sockets,networking,udp,multicast,Sockets,Networking,Udp,Multicast,我有三个网络接口(在我的窗口7下) 我有UDP套接字(AF_INET),它没有通过bind调用绑定到任何addr 我尝试将数据报发送到239.255.255.250。正如我在Wireshark中看到的,只有192.168.139.1源地址用于通过192.168.139.0/24网络发送数据报 我想我需要告诉winsock它必须从哪个接口发送数据报,并尝试调用setsockopt: UINT adapterId = 10; setsockopt(sock, IPPROTO_IP, IP_MULTI
UINT adapterId = 10;
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, (char*)&adapterId, sizeof(adapterId));
但我这里有一个10049(WSAEADDRNOTAVAIL)错误
如何通过我的真实网络发送数据报,或通过我的多宿主机的所有网络发送数据报
很久以前,我的代码(但没有setsockopt调用)在WinXP下运行良好,但我记不起来了,该系统有一个或多个网络适配器。您的思路是正确的。您必须按照上面的代码依次通过每个NIC循环发送所有NIC。导致10049错误的原因是指定了错误的地址或该主机的非本地地址。在这种情况下,您错误地传递了适配器ID而不是IP地址。这个问题很愚蠢。我读错了文档,它告诉我IP_MULTICAST_IF adapterId必须是主机字节顺序,而不是网络。在其他文档中,我发现了这一点的不同,并添加了htonl。之后,设置IP_MULTICAST_IF不会失败,所有数据报都会发送到所有网络。事实上,您可以在
IP_mreqn.imr_address
字段中的一次调用中同时指定NIC的IP地址。
UINT adapterId = 10;
setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, (char*)&adapterId, sizeof(adapterId));