全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++如何实现简单的DNS域名解析_c++ getaddrinfo函数与IP地址转换【方法】

不能,getaddrinfo 返回 struct addrinfo 链表,含二进制地址结构,需调用 getnameinfo 或 inet_ntop 才能转为 IP 字符串;它返回多个结果因域名可能对应多个 A/AAAA 记录或同时存在 IPv4/IPv6 地址。

getaddrinfo 能不能直接解析域名到 IP 字符串?

不能。它返回的是 struct addrinfo 链表,里面存的是二进制地址结构(sockaddr_insockaddr_in6),不是可读的 "192.168.1.1" 这种字符串。必须调用 getnameinfo 才能转成点分十进制或 IPv6 字符串。

为什么 getaddrinfo 有时返回多个结果?

一个域名可能对应多个 A 记录(IPv4)或 AAAA 记录(IPv6),也可能同时有 IPv4 和 IPv6 地址。系统按 hints.ai_familyhints.ai_socktype 过滤,但默认行为是返回所有匹配项。

  • hints.ai_family = AF_UNSPEC:同时查 IPv4 和 IPv6,结果按系统偏好排序(通常 IPv6 在前)
  • hints.ai_family = AF_INET:只查 IPv4,结果里全是 sockaddr_in
  • hints.ai_socktype = SOCK_STREAM:优先返回支持 TCP 的地址(影响部分 CDN 或负载均衡场景)

常见错误:getaddrinfo 返回 EAI_NONAME 或 EAI_NODATA

这不是网络不通,而是 DNS 层面没查到记录。典型原因包括:

  • 传入的 node 参数为 nullptr 或空字符串(必须是非空域名)
  • 系统 DNS 配置异常(比如 /etc/resolv.conf 为空或 nameserver 不可达)
  • 域名本身不存在,或只存在 CNAME 但未开启递归查询(getaddrinfo 默认递归,一般不需干预)
  • 在 Windows 上未调用 WSAStartup 就调用 getaddrinfo → 直接崩溃或返回 WSANOTINITIALISED

完整解析示例:域名 → IPv4 字符串

下面代码只取第一个 IPv4 地址并转成字符串,忽略 IPv6 和多地址场景,适合快速验证:

#include 
#include 
#include 
#include 
#include 
#include 

std::string resolve_ipv4(const std::string& hostname) { struct addrinfo hints = {}, *result = nullptr; hints.ai_family = AF_INET; // 只要 IPv4 hints.ai_socktype = SOCK_DGRAM; // 类型不影响解析,但需明确

int s = getaddrinfo(hostname.c_str(), nullptr, &hints, &result);
if (s != 0) {
    std::cerr zuojiankuohaophpcnzuojiankuohaophpcn "getaddrinfo: " zuojiankuohaophpcnzuojiankuohaophpcn gai_strerror(s) zuojiankuohaophpcnzuojiankuohaophpcn "\n";
    return {};
}

char ipstr[INET_ADDRSTRLEN];
const void* addr = &((struct sockaddr_in*)result-youjiankuohaophpcnai_addr)-youjiankuohaophpcnsin_addr;
if (inet_ntop(AF_INET, addr, ipstr, sizeof(ipstr)) == nullptr) {
    freeaddrinfo(result);
    return {};
}

std::string out(ipstr);
freeaddrinfo(result);
return out;

}

注意:inet_ntopgetnameinfo 更轻量,且不依赖 DNS 反查;但仅适用于已知地址族的场景(如上例限定 AF_INET)。若要兼容 IPv4/IPv6 通用解析,必须用 getnameinfo 并传入 NI_NUMERICHOST 标志。

容易被忽略的一点:getaddrinfo 分配的内存必须用 freeaddrinfo 释放,否则每次调用都泄漏 —— 这在循环解析中会迅速耗尽资源。


# node  # windows  # ipv6  # ai  # c++  # ios  # win  # dns  # cdn  # stream  # 为什么  # 字符串  # 递归  # 循环  # Struct  # 负载均衡  # 多个  # 的是  # 转成  # 链表  # 第一个  # 适用于  # 这不是  # 不存在  # 可达 


相关文章: 正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  IOS倒计时设置UIButton标题title的抖动问题  宝塔建站助手安装配置与建站模板使用全流程解析  如何在Golang中引入测试模块_Golang测试包导入与使用实践  油猴 教程,油猴搜脚本为什么会网页无法显示?  临沂网站制作公司有哪些,临沂第四中学官网?  如何彻底删除建站之星生成的Banner?  网站按钮制作软件,如何实现网页中按钮的自动点击?  如何配置WinSCP新建站点的密钥验证步骤?  如何在宝塔面板中创建新站点?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  网页设计与网站制作内容,怎样注册网站?  Python多线程使用规范_线程安全解析【教程】  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  建站主机数据库如何配置才能提升网站性能?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  建站之星导航菜单设置与功能模块配置全攻略  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  制作营销网站公司,淘特是干什么用的?  ,网站推广常用方法?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  高防服务器租用如何选择配置与防御等级?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  山东网站制作公司有哪些,山东大源集团官网?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  MySQL查询结果复制到新表的方法(更新、插入)  如何破解联通资金短缺导致的基站建设难题?  5种Android数据存储方式汇总  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  高端企业智能建站程序:SEO优化与响应式模板定制开发  学校为何禁止电信移动建设网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  建站之星在线版空间:自助建站+智能模板一键生成方案  建站主机无法访问?如何排查域名与服务器问题  沈阳制作网站公司排名,沈阳装饰协会官方网站?  实例解析angularjs的filter过滤器  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  香港服务器如何优化才能显著提升网站加载速度?  微信小程序 五星评分(包括半颗星评分)实例代码  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  高端网站建设与定制开发一站式解决方案 中企动力  制作网站的软件免费下载,免费制作app哪个平台好?  香港网站服务器数量如何影响SEO优化效果?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  ,石家庄四十八中学官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。