首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C/C++中是否有一个库函数来确定IP地址(IPv4和IPv6)是否是私有/本地的?

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

Stack Overflow用户
提问于 2013-01-12 19:56:48
回答 2查看 2.7K关注 0票数 1

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 20:11:57

这将帮助您开始。我没有费心包括“链接本地”地址范围,但这是一个留给您通过修改下面的代码来完成的练习。

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

完成此示例所需了解的所有内容都在this link here上。

代码语言:javascript
复制
// 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;
}
票数 2
EN

Stack Overflow用户

发布于 2021-08-26 20:11:44

来自uhttpd源:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14293095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档