IP落在CIDR范围内

5
我有一个这样的IP: 12.12.12.12
我正在循环遍历不同的IP范围(例如,12.12.12.0/24),并尝试判断该IP是否在此范围内。
我尝试过各种方法,如inet_addr和比较,但似乎都无法实现。
有没有简单的方法可以做到这一点?我使用的是Windows系统。

相关链接:http://stackoverflow.com/questions/1507579/how-can-i-determine-that-user-ip-address-is-in-accessible-range-or-not - Marc B
这是 PHP,正如你从我使用的标签中所看到的,我也会用 C++。 - seth
2个回答

9

只是测试一下是否:

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

您可以通过以下方法从CIDR参数range/netbits确定子网掩码:

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

1
在执行此操作之前,可能需要进行 ntohl 转换。 - KillianDS
你看到这里有什么问题吗?似乎每个都会打印:`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);` - seth
@seth:你从 printf("%08x %08x %d\n", ulstart, ulcheck, cidr); 得到了什么?但是掩码应该测试 range(或者在你的命名中是 ulstart),而不是 cidr - Ben Voigt
1
~uint32_t(0)是一种有趣的写法,表示0xffffffffu - caf
1
@Ben Voigt:那么0xffffffffu将具有类型unsigned long,并且仍将具有相同的。请阅读常量规则。 - caf
显示剩余11条评论

2
将二进制表示法中与您的网络掩码不匹配的部分清零。
澄清: 假设您有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是否“在”range中:ip & mask == range & mask

迭代显然来自对一堆范围进行测试。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接