2

我需要使用本地 C++ 代码在具有多个网络适配器的 Windows 机器上进行 UDP 广播(我认为这应该是理想的多播)。

目前,我在套接字上设置 SO_BROADCAST 套接字选项以允许广播,然后发送到 INADDR_BROADCAST 地址 (255.255.255.255)。这在具有多个网络适配器的机器上并不可靠。

我一直在四处寻找,并在 Stack Overflow 上发现了很多关于此的问题。据我所知,最好的方法似乎是找出每个网络适配器的广播 IP,然后遍历那些发送到每个网络适配器的 IP。

因此,例如,如果我的机器有一个 IP 地址为 10.0.0.x 的网络适配器和另一个 IP 地址为 192.168.1.x 的网络适配器,那么我需要将消息发送到 10.0.0.255 和 192.168.1.255。

尽管我查看了所有问题/答案,但我无法将这些点连接起来以获取上述地址列表。

谁能指出我正确的方向?例如,我找到了一些使用 GetAdaptersAddresses 枚举 IP 地址的示例代码,但我看不到在哪里可以获得每个地址的子网掩码。如果没有子网掩码,我无法确定广播地址。我需要 IP 地址列表和每个地址的子网掩码,这样我就可以形成要发送到的广播地址列表。

4

2 回答 2

4

API 调用 GetAdaptersInfo 为每个网络适配器填充一个 IP_ADAPTER_INFO 结构。根据文档,地址列表中提供了掩码:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366062(v=vs.85).aspx

一旦有了 IP 地址和掩码,您就可以计算广播地址:

根据 ip 和子网掩码计算广播地址

于 2013-03-14T23:55:09.880 回答
2

RichardBrock 的回答是正确的,GetAdaptersInfo 提供了所需的信息。这是一些更具体地显示如何执行此操作的代码。请注意,此代码使用 MFC 和字符串转换宏 STR_A2T,它只是将 char* 字符串转换为 wchar_t* 字符串,因为项目是为 Unicode 构建的。结果是一个字符串数组,其中每个字符串都是一个广播 IP。然后我们只是遍历这些并发送给每个人。

CStringArray baList;
baList.RemoveAll();

ULONG bufSz = 0;
if (GetAdaptersInfo(NULL,&bufSz) == ERROR_BUFFER_OVERFLOW)
{
    vector<BYTE> buf;
    buf.resize(bufSz,0);
    if (GetAdaptersInfo((IP_ADAPTER_INFO*)&buf[0],&bufSz) == ERROR_SUCCESS)
    {
        IP_ADAPTER_INFO* pAdapterInfo = (IP_ADAPTER_INFO*)&buf[0];
        for(; pAdapterInfo != NULL; pAdapterInfo = pAdapterInfo->Next)
        {
            unsigned long ip = inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
            unsigned long mask = inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
            unsigned long bcip = ip | ~mask;
            struct in_addr ia;
            ia.S_un.S_addr = bcip;
            CString broadcastAddr;
            STR_A2T(inet_ntoa(ia),broadcastAddr);
            baList.Add(broadcastAddr);
        }
    }
}
于 2013-03-15T01:54:00.997 回答