首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从IPv4映射的IPv6地址解析IPv4地址?

如何从IPv4映射的IPv6地址解析IPv4地址?
EN

Stack Overflow用户
提问于 2013-01-11 14:09:43
回答 2查看 6.1K关注 0票数 0

如何从IPv4映射的IPv6地址中获取IPv4地址?

例如,我有一个IP地址::FFFF:129.144.52.38。从这里,我需要提取129.144.52.38。是否有用于此目的的API?

我可以使用以下函数识别IPv6或IPv4地址族

代码语言:javascript
复制
int getaddrfamily(const char *addr)
{
    struct addrinfo hint, *info =0;
    memset(&hint, 0, sizeof(hint));
    hint.ai_family = AF_UNSPEC;
    // Uncomment this to disable DNS lookup
    //hint.ai_flags = AI_NUMERICHOST;
    int ret = getaddrinfo(addr, 0, &hint, &info);
    if (ret)
        return -1;
    int result = info->ai_family;
    freeaddrinfo(info);
    return result;
}

如果我给出一个IPv4映射的IPv6地址,那么如何能够识别它是否是一个映射的地址呢?是否有任何套接字应用程序接口可以从映射的IPv6地址中提取IPv4?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 01:44:41

尝试如下所示:

代码语言:javascript
复制
#ifndef IN6_IS_ADDR_V4MAPPED
#define IN6_IS_ADDR_V4MAPPED(a) \
       ((((a)->s6_words[0]) == 0) && \
        (((a)->s6_words[1]) == 0) && \
        (((a)->s6_word[2]) == 0) && \
        (((a)->s6_word[3]) == 0) && \
        (((a)->s6_word[4]) == 0) && \
        (((a)->s6_word[5]) == 0xFFFF))
#endif

unsigned long getIPv4addr(const char *addr)
{
    struct addrinfo hint, *info = 0;
    unsigned long result = INADDR_NONE;
    memset(&hint, 0, sizeof(hint));
    hint.ai_family = AF_UNSPEC;
    // Uncomment this to disable DNS lookup
    //hint.ai_flags = AI_NUMERICHOST;
    if (getaddrinfo(addr, 0, &hint, &info) == 0)
    {
        switch (info->ai_family)
        {
            case AF_INET:
            {
                struct sockaddr_in *addr = (struct sockaddr_in*)(info->ai_addr);
                result = addr->sin_addr.s_addr;
                break;
            }

            case AF_INET6:
            {
                struct sockaddr_in6 *addr = (struct sockaddr_in6*)(info->ai_addr);
                if (IN6_IS_ADDR_V4MAPPED(&addr->sin6_addr))
                    result = ((in_addr*)(addr->sin6_addr.s6_addr+12))->s_addr;
                break;
            }
        }
        freeaddrinfo(info);
    }
    return result;
}
票数 4
EN

Stack Overflow用户

发布于 2013-01-11 16:14:58

您只需从IPv6地址中提取最后四个字节,将它们组合成一个32位数字,就得到了您的IPv4地址。

当然,您首先需要检查它是否真的是IPv4映射的地址。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14272656

复制
相关文章

相似问题

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