bool isReservedIp(const char *ip)
{
static const char *address_blocks[] = {
"0.0.0.0/8",
"10.0.0.0/8",
"100.64.0.0/10",
"127.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
"192.0.0.0/24",
"192.0.2.0/24",
"192.88.99.0/24",
"192.168.0.0/16",
"198.18.0.0/15",
"198.51.100.0/24",
"203.0.113.0/24",
"224.0.0.0/4",
"240.0.0.0/4",
"255.255.255.255/32"
};
static const int blk_nums = sizeof(address_blocks) / sizeof(*address_blocks);
static __thread char buf[40];
for (int i = 0; i < blk_nums; ++i) {
strncpy(buf, address_blocks[i], sizeof(buf));
char *pos = strchr(buf, '/');
assert(pos != NULL);
*pos = '\0';
uint32_t val = ntohl(inet_addr(buf)); // little endian
uint32_t msk = atoi(pos + 1);
uint32_t offset = 32 - msk;
uint32_t tar = ntohl(inet_addr(ip));
if ((val >> offset) == (tar >> offset))
return true;
}
return false;
}
bool isReservedIp(uint32_t ip) // little endian
{
static const char *address_blocks[] = {
"0.0.0.0/8",
"10.0.0.0/8",
"100.64.0.0/10",
"127.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
"192.0.0.0/24",
"192.0.2.0/24",
"192.88.99.0/24",
"192.168.0.0/16",
"198.18.0.0/15",
"198.51.100.0/24",
"203.0.113.0/24",
"224.0.0.0/4",
"240.0.0.0/4",
"255.255.255.255/32"
};
static const int blk_nums = sizeof(address_blocks) / sizeof(*address_blocks);
static __thread char buf[40];
for (int i = 0; i < blk_nums; ++i) {
strncpy(buf, address_blocks[i], sizeof(buf));
char *pos = strchr(buf, '/');
assert(pos != NULL);
*pos = '\0';
uint32_t val = ntohl(inet_addr(buf)); // little endian
uint32_t msk = atoi(pos + 1);
uint32_t offset = 32 - msk;
if ((val >> offset) == (ip >> offset))
return true;
}
return false;
}
C++判断ip是否为保留ip
最新推荐文章于 2024-07-15 17:26:33 发布