首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有多个网络适配器的计算机上的UDP广播

具有多个网络适配器的计算机上的UDP广播
EN

Stack Overflow用户
提问于 2013-03-15 07:19:11
回答 2查看 6.6K关注 0票数 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地址的列表,以及每个地址的子网掩码,这样我才能形成要发送到的广播地址列表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-15 07:55:10

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

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

获得IP地址和掩码后,即可计算广播地址:

Calculate broadcast address from ip and subnet mask

票数 4
EN

Stack Overflow用户

发布于 2013-03-15 09:54:01

理查德布洛克的回答是正确的,GetAdaptersInfo提供了所需的信息。下面是一些代码,更具体地展示了如何做到这一点。注意,这段代码使用了MFC和一个字符串转换宏STR_A2T,它只是将char*字符串转换为wchar_t*字符串,因为项目是为Unicode构建的。结果是一个字符串数组,其中每个字符串数组都是一个广播IP。然后我们只需遍历它们并发送到每一个。

代码语言:javascript
运行
复制
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);
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15421997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档