【发布时间】:2023-04-05 10:50:02
【问题描述】:
我有这样的 IP:12.12.12.12
我正在遍历不同的 IP 范围(以 12.12.12.0/24(示例)格式),并尝试查看 IP 是否在该范围内。
我尝试了各种方法,例如 inet_addr 和比较,但我似乎无法得到它。
是否有捷径可寻?我正在使用 Windows。
【问题讨论】:
-
这是 PHP,从我使用 C++ 的标签中可以看出
我有这样的 IP:12.12.12.12
我正在遍历不同的 IP 范围(以 12.12.12.0/24(示例)格式),并尝试查看 IP 是否在该范围内。
我尝试了各种方法,例如 inet_addr 和比较,但我似乎无法得到它。
是否有捷径可寻?我正在使用 Windows。
【问题讨论】:
取二进制表示并将与您的网络掩码不匹配的内容归零。
澄清:
假设您拥有 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。
【讨论】:
只测试是否:
(ip & netmask) == (range & netmask)
您可以从 CIDR 参数range/netbits 确定网络掩码,如下所示:
uint32_t netmask = ~(~uint32_t(0) >> netbits);
【讨论】:
ntohl 转换。
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。
0xffffffffu 将具有unsigned long 类型,并且仍然具有相同的值。阅读常量规则。