2012-11-19 73 views
0

的范围我在无符号长格式的IP地址,在编码C++ 我有一个CIDR标记的IP地址范围,例如“10.2.3.98/24”IP地址重叠/在CIDR

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

+2

你是否需要帮助解析给定的字符串,或者你是否已经完成了这些操作并需要位掩码帮助? –

+0

我的问题是从IP地址,我作为无符号长到IP范围表示法的表示开始和结束在无符号长,所以我可以做我的范围检查。换句话说,如何从“10.2.3.98/24”到无符号长整数的低和高范围 – reza

回答

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))); 
} 
0

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

0

让我们假设你的IP地址和掩码如下,IP地址是整数形式。

例30分之3232235896==>(实际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范围转换为整数范围并使用它们来查找重叠。