如何在iOS平台获取URL的IPv4与IPv6地址?
获取域名的IPv4和IPv6地址
你当前用的gethostbyname是仅支持IPv4的老旧接口,要同时获取IPv4和IPv6地址,得用标准的getaddrinfo函数,它能兼容两种地址类型,实现和dig stackoverflow.com A stackoverflow.com AAAA +short一致的效果。
以下是完整实现代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <arpa/inet.h> int main() { const char *hostname = "stackoverflow.com"; struct addrinfo hints, *result, *rp; int status; char ipstr[INET6_ADDRSTRLEN]; // 初始化配置,允许同时获取IPv4和IPv6地址 memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; // 不限制地址类型 hints.ai_socktype = SOCK_STREAM; // 指定TCP类型(不影响地址解析) // 调用接口获取地址链表 if ((status = getaddrinfo(hostname, NULL, &hints, &result)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status)); return 1; } // 遍历链表输出所有地址 for (rp = result; rp != NULL; rp = rp->ai_next) { void *addr; char *ipver; // 判断地址类型 if (rp->ai_family == AF_INET) { // IPv4 struct sockaddr_in *ipv4 = (struct sockaddr_in *)rp->ai_addr; addr = &(ipv4->sin_addr); ipver = "IPv4"; } else { // IPv6 struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)rp->ai_addr; addr = &(ipv6->sin6_addr); ipver = "IPv6"; } // 二进制地址转字符串 inet_ntop(rp->ai_family, addr, ipstr, sizeof(ipstr)); printf("%s: %s\n", ipver, ipstr); } // 释放链表内存 freeaddrinfo(result); return 0; }
关键说明
hints.ai_family = AF_UNSPEC:明确告诉函数返回IPv4和IPv6两种地址getaddrinfo返回地址链表,每个节点对应一个解析出的地址- 通过
ai_family字段区分IPv4(AF_INET)和IPv6(AF_INET6) inet_ntop是inet_ntoa的升级版,完美支持IPv6地址转换
编译运行
用gcc编译:
gcc -o resolve_ip resolve_ip.c
运行后会输出类似dig命令的结果:
IPv4: 151.101.1.69 IPv4: 151.101.65.69 IPv4: 151.101.129.69 IPv4: 151.101.193.69 IPv6: 2606:4700::6810:172e IPv6: 2606:4700::6810:162e
内容的提问来源于stack exchange,提问作者Bob The Coder
相关产品推荐
相关产品推荐

