簡體   English   中英

IP 地址重疊/在 CIDR 范圍內

[英]IP Address overlapping/in range of CIDR

我有一個無符號長格式的 IP 地址,用 C++ 編碼我有一個 CIDR 表示法 IP 地址范圍,例如“10.2.3.98/24”

如何檢查我的 IP 地址是否與上述范圍重疊?

為了盡可能簡單,斜線之后的部分都保留,基本上位。 因此,例如,/ 24表示保留了最高3個字節(24位)。 因此,可以通過掩蓋地址並檢查是否相等來查看地址是否適合。 地址和面具本身將是最小的; 如果您正在尋找最大值,則可以與掩碼的倒數進行或運算。

如果您已經知道IP地址為無符號長和數字,這應該可以工作:

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

讓我們假設您的IP地址和掩碼如下,並且IP地址為整數形式。

示例3232235896/30 ==>(實際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范圍轉換為Integers范圍,然后使用它們查找重疊。

此函數檢查兩個網絡是否重疊。

#include <arpa/inet.h>
#include <netinet/in.h>

static inline bool cidr_overlap(struct in_addr ip1, int n1, 
                                struct in_addr ip2, int n2)
{
    uint32_t mask1 = ~(((uint32_t)1 << (32 - n1)) - 1);
    uint32_t mask2 = ~(((uint32_t)1 << (32 - n2)) - 1);

    return (htonl(ip1.s_addr) & mask1 & mask2) == 
           (htonl(ip2.s_addr) & mask1 & mask2);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM