2012-11-19 82 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範圍轉換爲整數範圍並使用它們來查找重疊。