我最近发现,如果我有拨号连接(这是用于自助服务终端)和局域网连接,当建立拨号连接(具有互联网访问权限)时,我的多播发送默认为拨号而不是我的LAN NIC。这使得多播转而使用拨号连接而不是具有多个多播订户的LAN。
我知道我需要使用IP_MULTICAST_IF来设置我的多播套接字上的接口。问题是如何枚举接口以及如何在setsockopt中使用IP_MULTICAST_IF? 在自助服务终端Windows XP Embedded上,总会有一个局域网连接NIC。如何获取此接口并将其IP地址(这是IP_MULTICAST_IF所期望的那样)传递给setsockopt?
答案 0 :(得分:4)
如果使用setsockopt
代替IP_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
时无法使用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));