【问题标题】:IP Address overlapping/in range of CIDRIP 地址重叠/在 CIDR 范围内
【发布时间】:2012-11-07 23:57:44
【问题描述】:

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

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

【问题讨论】:

  • 您是否需要帮助解析给定的字符串,或者您是否已经这样做并需要位掩码方面的帮助?
  • 我的问题是从我拥有无符号长的 IP 地址到 IP 范围表示法的表示以无符号长开始和结束,这样我就可以进行范围检查。换句话说,如何从“10.2.3.98/24”到 unsigned long 中的低和高范围

标签: c++ c network-programming ip


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您已经知道 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)));
    }
    

    【讨论】:

      【解决方案3】:

      假设您的 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 范围转换为整数范围并使用它们来查找重叠。

      【讨论】:

        【解决方案4】:

        这个函数检查两个网络是否重叠。

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

        【讨论】:

          猜你喜欢
          • 2023-04-05
          • 1970-01-01
          • 2020-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-22
          • 2012-03-26
          • 1970-01-01
          相关资源
          最近更新 更多