如何多播(发送)到第一个网卡?

我最近发现,如果我有一个拨号连接(这是一个自助服务terminal)和一个局域网连接,当build立拨号连接(与互联网接入),我的组播sendto默认拨号而不是我的LAN网卡。 这使得多点传送到拨号连接,而不是我的局域网,有几个多播用户。

我明白,我需要使用IP_MULTICAST_IF来设置我的多播套接字接口。 问题是如何枚举接口,如何在setsockopt中使用IP_MULTICAST_IF? 在Windows XP Embedded服务terminal上,总是只有一个局域网连接NIC。 我如何获得这个接口,并通过它的IP地址(这是什么IP_MULTICAST_IF期望??)setsockopt?

Solutions Collecting From Web of "如何多播(发送)到第一个网卡?"

显然setsockoptIP_MULTICAST_IF不工作,如果使用wsock32.dll而不是ws2_32.dll 。 当我不断地获得1.0.0.0作为IP地址时,我认为我做错了,即使它是用setsockopt设置的其他东西。 有趣的是,在调用IP_MULTICAST_IF之前,它会返回0.0.0.0 ,所以setsockopt`确实改变了一些东西,只是不正确。

其他人在2004年也遇到了同样的问题 – http://us.generation-nt.com/ip-multicast-problem-help-37595922.html 。 当我们#include "winsock2.h"我们需要使用ws2_32.dll 。 但是,使用C ++ Builder时,当我们使用ws2_32.dll时,不可能使用ws2_32.dll – RTL在wsock32.dll中隐式链接,即使明确指定了#pragma comment(lib, "ws2_32.lib")也不能链接ws2_32.dll #pragma comment(lib, "ws2_32.lib") 。 Embarcadero真的需要解决这个问题! RTL团队中的某个人肯定已经决定暗中包含wsock32.dll是很聪明的 。 它所做的唯一“巧妙的”事情是用户不必在代码中包含一行代码 – #pragma comment(lib, "wsock32.lib") 。 当他们在那,他们可能包括每个人类已知的DLL文件。

使用GetAdaptersAddresses()枚举所有可用的接口IP地址。

IP_MULTICAST_IF仅用于IPv4地址。 它希望你传递一个包含所需IPv4地址的DWORD值(以网络字节顺序)到setsockopt() ,例如:

 DWORD dwIP = ...; setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, (char *)&dwIP, sizeof(dwIP));