如何验证广播IP地址?
是否可以提供任何广播地址(假设1.2.3.4)。如果是,将对其他网络的通信产生什么影响。
发布于 2013-05-16 15:05:07
IP地址和网络掩码确定广播地址。您不能只使用任何广播地址,否则任何需要广播通信的内容都无法工作。
网络掩码指定子网的大小。255.255.255.0
的网络掩码通常表示为/24
,这意味着IP地址的前24位指定了网络ID,其中最后8位是针对单个主机的。192.168.0.100/24
是网络上的主机,ID为192.168.0.0
,广播地址为192.168.0.255
。网络中可用的最高值是广播地址。
10.1.2.3/8
的广播地址是10.255.255.255
,它的十进制子网掩码是255.0.0.0
。
发布于 2022-04-30 23:38:29
正如Brad提到的,如果您有网络掩码,那么计算广播地址非常容易。您只需交换所有位,并使用主IP地址执行OR操作。
现在不推荐输入诸如255.255.255.0
这样的掩码。相反,您需要在IP上使用多个位。例如:192.168.36.226/24
。
24表示从最重要位开始的1s数。这是与IPv6相同的原理,它使用128位代替。因此,对于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
}
}
有了这些信息,您应该能够找到上面使用的地址和掩码。请注意,所有接口都可能不支持广播(我认为不太可能)。
有关完整的实现,请参见利巴德尔 (C++)。接口实现在libaddr/iface.cpp
中找到。
https://stackoverflow.com/questions/16567434
复制相似问题