如何从 IPv4 映射的 IPv6 地址解析 IPv4 地址? [英] How to resolve IPv4 address from IPv4 mapped IPv6 address?

查看:162
本文介绍了如何从 IPv4 映射的 IPv6 地址解析 IPv4 地址?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How to get the IPv4 address from IPv4-mapped IPv6 addresses?

例如,我有一个 IP 地址 ::FFFF:129.144.52.38.从中,我需要提取129.144.52.38.是否有任何用于此目的的 API?

For e.g I have an IP address ::FFFF:129.144.52.38. from this, I need to extract 129.144.52.38. Is there any API for this purpose?

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

I can identify IPv6 or IPv4 address family by using the following function

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 地址,那么如何识别它是否是一个映射地址?是否有任何套接字 API 可以从映射的 IPv6 地址中提取 IPv4?

If I give a IPv4 mapped IPv6 address, then how it's possible to identify if it's a mapped adress? Is there any socket API to extract IPv4 from a mapped IPv6 address?

推荐答案

试试这个:

#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;
}

这篇关于如何从 IPv4 映射的 IPv6 地址解析 IPv4 地址?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆