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

Posted

技术标签:

【中文标题】是否有库函数来确定 IP 地址(IPv4 和 IPv6)在 C/C++ 中是否为私有/本地?【英文标题】:Is there a library function to determine if an IP address (IPv4 and IPv6) is private/local in C/C++? 【发布时间】:2012-12-26 21:59:52 【问题描述】:

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

2、给定一个128位整数值,如何准确判断是否为私有IPv6地址。

考虑到IP地址在不同平台上的字节顺序,每次都写这么普通的小函数很容易出错。所以我认为应该有一个库函数,是吗?

【问题讨论】:

查看分配的范围。任君挑选。 “应该有一个库函数”——在哪个库中? @Csq,例如,winsock。 【参考方案1】:

这将使您入门。我没有打扰包括“链接本地”地址范围,但这是一个留给您通过修改下面的代码来完成的练习。

IPV6 略有不同。而且你的问题有点畸形,因为大多数系统都没有原生的 128 位类型。 IPv6 地址通常以 16 字节数组的形式包含在 sockaddr_in6 结构中。

完成此示例所需了解的所有内容都在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;

【讨论】:

只是指出 b4 没有在代码中正确初始化/分配,不确定它是否是练习的一部分。如果有人想使用这个 sn-p 作为自己函数的起点,应该小心。【参考方案2】:

来自 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;

【讨论】:

以上是关于是否有库函数来确定 IP 地址(IPv4 和 IPv6)在 C/C++ 中是否为私有/本地?的主要内容,如果未能解决你的问题,请参考以下文章

算法判断IP地址是不是合法的,包含IPv4和IPv6

算法判断IP地址是不是合法的,包含IPv4和IPv6

IPv4数据报格式及其语义

公共 IPv4 地址的总数是多少?

window10自动配置ipv4 169.254.130.49首选

如图一个网卡为啥有两个ip4地址?