如何组播(发送)到第一个NIC?

时间:2011-10-06 23:41:24

标签: c windows windows-xp winsock multicast

我最近发现,如果我有拨号连接(这是用于自助服务终端)和局域网连接,当建立拨号连接(具有互联网访问权限)时,我的多播发送默认为拨号而不是我的LAN NIC。这使得多播转而使用拨号连接而不是具有多个多播订户的LAN。

我知道我需要使用IP_MULTICAST_IF来设置我的多播套接字上的接口。问题是如何枚举接口以及如何在setsockopt中使用IP_MULTICAST_IF? 在自助服务终端Windows XP Embedded上,总会有一个局域网连接NIC。如何获取此接口并将其IP地址(这是IP_MULTICAST_IF所期望的那样)传递给setsockopt?

2 个答案:

答案 0 :(得分:4)

如果使用setsockopt代替IP_MULTICAST_IF,则显然wsock32.dllws2_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时无法使用winsock2.h - RTL隐式链接到wsock32.dll,即使您明确指定{{1},也无法链接ws2_32.dll }。 Embarcadero真的需要解决这个问题! RTL团队中的某个人必须已经确定聪明隐式包含wsock32.dll。它所做的唯一'聪明'事情是用户不必在他们的代码中包含一行 - #pragma comment(lib, "ws2_32.lib")。虽然他们就是这样,但他们可能还包括人类已知的每一个DLL文件。

答案 1 :(得分:0)

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

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

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