IP地址重叠/在CIDR范围内

时间:2012-11-19 23:37:59

标签: c++ c network-programming ip

我有一个无符号长格式的IP地址,用C ++编码 我有一个CIDR表示法IP地址范围,例如“10.2.3.98/24”

如何检查我的IP地址是否与上述范围重叠?

3 个答案:

答案 0 :(得分:0)

为了尽可能简单,斜杠之后的部分基本上是要保留的位。因此,例如/ 24表示保留最重要的3个字节(24位)。因此,您可以通过屏蔽它并检查相等性来查看地址是否适合。地址和面具本身就是分钟;如果你正在寻找最大值,你可以使用掩码的逆矩阵。

答案 1 :(得分:0)

如果你已经知道ip地址为unsigned long和数字,那么这应该有效:

bool cidr_overlap(uint32_t ip1, int n1,
                  uint32_t ip2, int n2)
{
    return (ip1 <= (ip2 | ((1ul << (32-n2))-1)))
        || (ip2 <= (ip1 | ((1ul << (32-n1))-1)));
}

答案 2 :(得分:0)

假设您的IP地址和掩码为Follows和IP地址是整数形式。

示例3232235896/30 ==&gt; (实际IP 192.168.1.120/30)

让我们说你需要找出(ip_one,mask_one)和(ip_two,mask_two)的重叠

uint32_t mask_one_max = ((1ul << (32 - mask_one)) - 1);
uint32_t mask_one_min = ~mask_one_max;

uint32_t mask_two_max = ((1ul << (32 - mask_two)) - 1);
uint32_t mask_two_min = ~mask_two_max;

return (((ip_one & mask_one_min) <= (ip_two | mask_two_max)) && ((ip_two & mask_two_min) <= (ip_one | mask_one_max)));

如果发生重叠,这将返回true。

基于寻找两个整数范围重叠的通用方法提出解决方案。正如您在解决方案中看到的,我首先将CIDR范围转换为整数范围,并使用它们来查找重叠。