正如 Brad 所说,如果您有网络掩码,那么计算广播地址就非常容易。您只需交换所有位并与主 IP 地址进行 OR。
现在不推荐使用 255.255.255.0 等掩码。相反,您应该在 IP 上使用多个位。例如:192.168.36.226/24。
数字 24 表示从最高有效位开始的 1 的数量。这与使用 128 位的 IPv6 的原理相同。因此,使用 IPv6 时,这些数字通常要大得多。
计算 IPv4 掩码的一种方法是使用 -1 和 32 - size(我们的例子是 32 - 24 = 8):
size = 24; // somehow you get this number...
...
unsigned int mask = -1;
shift = 32 - size;
mask <<= shift; // C++ operator, in C write: mask = mask << shift;
现在您可以通过翻转掩码的所有位并将其与 IP 进行 ORing 来计算广播地址:
broadcast_bits = ~mask;
broadcast_ip = ip | broadcast_bits;
我认为 IPv6 做同样的事情,但使用 128 位。 IPv6 也不提供多播(匹配 224.0.0.0/4 的 IP)。
如果您的问题是关于查找以太网或类似网卡接口中定义的广播地址,那么上面的代码不是您感兴趣的。相反,您想列出接口,列出每个 IP 地址在每个接口上定义(在某些系统上,一个接口上最多可以有 65536 个 IP)。该列表包括广播 IP 地址和主 IP 地址以及掩码。换句话说,你可以这样做:
if(my_ip & mask == interface->ip & mask)
{
if(my_ip == interface->broadcast_ip)
{
return interface;
}
}
return nullptr;
通过以下方式访问接口列表:
struct ifaddrs * ifa_start(nullptr);
getifaddrs(&ifa_start);
for(struct ifaddrs * ifa(ifa_start); ifa != nullptr; ifa = ifa->ifa_next)
{
if((ifa->ifa_flags & IFF_BROADCAST) != 0
&& ifa->ifa_broadaddr != nullptr)
{
// found the broadcast address of that interface
}
}
有了这些信息,您应该能够找到上面使用的地址和掩码。请注意,所有接口可能不支持广播(我认为不太可能)。
有关完整实现,请参阅libaddr (C++)。接口实现见libaddr/iface.cpp。