如何从IPv4映射的IPv6地址中解析IPv4地址
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_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;
}
您只需从IPv6地址中提取最后四个字节,将它们组合成单个32位数字,就可以得到您的IPv4地址。
当然你需要先检查它是否真的是ipv4映射地址
相关文章:
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 比较 ipv4 地址 - sockaddr_in
- CIDR 表示法中 IPv4 地址的正则表达式
- 用于in_addr结构(IPv4地址)的Mac/Windows不同格式
- 使用inet_pton()获取IPv4地址的无符号int表示形式
- 正在将IPv4/IPv6地址和端口设置为sockaddr_storage结构
- 使用 boost-spirit 解析 ipv4 地址
- 使用本地 ipv6 套接字将 UDP 发送到本地 ipv4 地址
- 如何获取 IP 地址(IPv4 为空,但存在 IPv6),内容的详细信息
- boost:asio IPv4地址和UDP通信
- 存储IPv4/IPv6地址的有效方式
- IPv4和IPv6地址的connect()行为
- 如何解析IPv4/IPv6地址块
- 从IPv4地址获取网络接口名称
- c++ winsock连接IPv4地址时被拒绝
- 从字符串中获取IPv4地址的最快方式
- 为什么 Linux 的 IPv4 地址占用 16 个字节而不是 4 个字节
- 如何从IPv4映射的IPv6地址中解析IPv4地址