0

IPv4 にマッピングされた IPv6 アドレスから IPv4 アドレスを取得するには?

たとえば、私は IP アドレスを持っています::FFFF:129.144.52.38。これから、抽出する必要があり129.144.52.38ます。この目的のための API はありますか?

次の関数を使用して、IPv6 または IPv4 アドレス ファミリを識別できます。

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 を抽出するソケット API はありますか?

4

2 に答える 2

4

次のようなことを試してください:

#ifndef IN6_IS_ADDR_V4MAPPED
#define IN6_IS_ADDR_V4MAPPED(a) \
       ((((a)->s6_words[0]) == 0) && \
        (((a)->s6_words[1]) == 0) && \
        (((a)->s6_words[2]) == 0) && \
        (((a)->s6_words[3]) == 0) && \
        (((a)->s6_words[4]) == 0) && \
        (((a)->s6_words[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;
}
于 2013-01-11T17:44:40.810 に答える
1

IPv6 アドレスから最後の 4 バイトを抽出し、それらを単一の 32 ビット数値に結合するだけで、IPv4 アドレスが得られます。

もちろん、最初にそれが実際に IPv4 にマップされたアドレスであることを確認する必要があります。

于 2013-01-11T08:14:57.923 に答える