1,给定一个32位整数值,如何准确确定它是否是私有IPv4地址。
2,给定128位整数值,如何准确确定它是否是私有IPv6地址。
考虑不同平台上IP地址的字节顺序,每次编写这样一个常见的小函数是容易出错的。所以我认为应该有一个库函数,是吗?
答案 0 :(得分:2)
这将帮助您入门。我没有打扰包括“链接本地”地址范围,但这是一个练习,您可以通过修改下面的代码来完成。
IPV6略有不同。由于大多数系统没有本机128位类型,因此您的问题会略有不正确。 IPv6地址通常包含在sockaddr_in6结构中嵌入的16个字节的数组中。
完成此示例需要了解的所有内容均为this link here。
// 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;
}