【问题标题】:IP falls in CIDR rangeIP 在 CIDR 范围内
【发布时间】:2023-04-05 10:50:02
【问题描述】:

我有这样的 IP:12.12.12.12
我正在遍历不同的 IP 范围(以 12.12.12.0/24(示例)格式),并尝试查看 IP 是否在该范围内。
我尝试了各种方法,例如 inet_addr 和比较,但我似乎无法得到它。
是否有捷径可寻?我正在使用 Windows。

【问题讨论】:

标签: c++ c ip


【解决方案1】:

取二进制表示并将与您的网络掩码不匹配的内容归零。

澄清: 假设您拥有 IP a.b.c.d 并希望将其与 e.f.g.h/i 匹配,那么您可以将 IP 放入一个无符号整数 uint32_t ip = a<<24 + b<<16 + c<<8 + d 并对 uint32_t range = e<<24 + f<<16 + g<<8 + h 执行相同操作。现在您可以使用您的网络掩码:uint32_t mask = (~0u) << (32-i)。现在,您可以通过比较 ip & mask == range & mask 来检查 ip 是否“在”range

【讨论】:

  • 迭代显然来自对一大堆范围的测试。
【解决方案2】:

只测试是否:

(ip & netmask) == (range & netmask)

您可以从 CIDR 参数range/netbits 确定网络掩码,如下所示:

uint32_t netmask = ~(~uint32_t(0) >> netbits);

【讨论】:

  • 在执行此操作之前可能需要进行ntohl 转换。
  • @KillianDS:我假设解析过程会产生一个本地字节顺序的地址,但你是对的,这是需要仔细检查的,特别是因为 inet_addr 返回网络字节顺序.
  • 您发现这里有问题吗?似乎为每一个打印:int cidr = atoi(cdrbuf); unsigned long ulstart = ntohl(inet_addr(clip)); unsigned long ulcheck = ntohl(inet_addr("12.12.12.12")); unsigned long netmask = ~unsigned long(~0ULL >> cidr); if((ulcheck & netmask) == (cidr & netmask)) printf("%s\n", pch);
  • ~uint32_t(0) 是一种有趣的写作方式0xffffffffu
  • @Ben Voigt:那么0xffffffffu 将具有unsigned long 类型,并且仍然具有相同的。阅读常量规则。
猜你喜欢
  • 2012-11-07
  • 2017-01-14
  • 1970-01-01
  • 2012-11-04
  • 2012-04-30
  • 2020-11-10
  • 2015-11-08
  • 2017-10-06
  • 1970-01-01
相关资源
最近更新 更多