我需要使用原生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地址的列表,以及每个地址的子网掩码,这样我才能形成要发送到的广播地址列表。
发布于 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地址和掩码后,即可计算广播地址:
发布于 2013-03-15 09:54:01
理查德布洛克的回答是正确的,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);
}
}
}
https://stackoverflow.com/questions/15421997
复制相似问题