是否有库函数来确定IP地址(IPv4和IPv6)在C / C ++中是私有/本地的?

时间:2013-01-12 11:56:48

标签: c++ c ip ip-address lan

1,给定一个32位整数值,如何准确确定它是否是私有IPv4地址。

2,给定128位整数值,如何准确确定它是否是私有IPv6地址。

考虑不同平台上IP地址的字节顺序,每次编写这样一个常见的小函数是容易出错的。所以我认为应该有一个库函数,是吗?

1 个答案:

答案 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;
}