1、给定一个32位整数值,如何准确判断是否为私有IPv4地址。
2、给定一个128位整数值,如何准确判断是否为私有IPv6地址。
考虑到IP地址在不同平台上的字节顺序,每次都写这么一个普通的小函数很容易出错。所以我认为应该有一个库函数,是吗?
1、给定一个32位整数值,如何准确判断是否为私有IPv4地址。
2、给定一个128位整数值,如何准确判断是否为私有IPv6地址。
考虑到IP地址在不同平台上的字节顺序,每次都写这么一个普通的小函数很容易出错。所以我认为应该有一个库函数,是吗?
这会让你开始。我没有打扰包括“链接本地”地址范围,但这是一个留给您通过修改下面的代码来完成的练习。
IPV6 略有不同。而且你的问题有点畸形,因为大多数系统都没有原生的 128 位类型。IPv6 地址通常包含在 sockaddr_in6 结构中的 16 字节数组中。
完成此示例所需了解的所有内容都在此链接中。
// assumes ip is in HOST order. Use ntohl() to convert as approrpriate
bool IsPrivateAddress(uint32_t ip)
{
uint8_t b1, b2, b3, b4;
b1 = (uint8_t)(ip >> 24);
b2 = (uint8_t)((ip >> 16) & 0x0ff);
b3 = (uint8_t)((ip >> 8) & 0x0ff);
b4 = (uint8_t)(ip & 0x0ff);
// 10.x.y.z
if (b1 == 10)
return true;
// 172.16.0.0 - 172.31.255.255
if ((b1 == 172) && (b2 >= 16) && (b2 <= 31))
return true;
// 192.168.0.0 - 192.168.255.255
if ((b1 == 192) && (b2 == 168))
return true;
return false;
}
来自 uhttpd 来源:
bool uh_addr_rfc1918(struct uh_addr *addr)
{
uint32_t a;
if (addr->family != AF_INET)
return false;
a = htonl(addr->in.s_addr);
return ((a >= 0x0A000000) && (a <= 0x0AFFFFFF)) ||
((a >= 0xAC100000) && (a <= 0xAC1FFFFF)) ||
((a >= 0xC0A80000) && (a <= 0xC0A8FFFF));
return 0;
}