如何从 IPv4 映射的 IPv6 地址解析 IPv4 地址? [英] How to resolve IPv4 address from IPv4 mapped IPv6 address?
本文介绍了如何从 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屋!
查看全文