Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何在所有连接的网络上发送UDP多播?_Sockets_Networking_Udp_Multicast - Fatal编程技术网

Sockets 如何在所有连接的网络上发送UDP多播?

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

我有三个网络接口(在我的窗口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_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));