[英]How to resolve IPv4 address from IPv4 mapped IPv6 address?
如何从映射了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地址,那么如何确定它是否是映射的地址? 是否有任何套接字API可以从映射的IPv6地址提取IPv4?
尝试这样的事情:
#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;
}
您只需从IPv6地址中提取最后四个字节,然后将它们组合成一个32位数字,便拥有了IPv4地址。
当然,您需要首先检查它是否确实是IPv4映射的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.