c++如何实现简单的DNS域名解析_c++ getaddrinfo函数与IP地址转换【方法】
发布时间 - 2025-12-31 00:00:00 点击率:次不能,getaddrinfo 返回 struct addrinfo 链表,含二进制地址结构,需调用 getnameinfo 或 inet_ntop 才能转为 IP 字符串;它返回多个结果因域名可能对应多个 A/AAAA 记录或同时存在 IPv4/IPv6 地址。
getaddrinfo 能不能直接解析域名到 IP 字符串?
不能。它返回的是 struct addrinfo 链表,里面存的是二进制地址结构(sockaddr_in 或 sockaddr_in6),不是可读的 "192.168.1.1" 这种字符串。必须调用 getnameinfo 才能转成点分十进制或 IPv6 字符串。
为什么 getaddrinfo 有时返回多个结果?
一个域名可能对应多个 A 记录(IPv4)或 AAAA 记录(IPv6),也可能同时有 IPv4 和 IPv6 地址。系统按 hints.ai_family 和 hints.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_ntop比getnameinfo更轻量,且不依赖DNS 反查;但仅适用于已知地址族的场景(如上例限定
AF_INET)。若要兼容 IPv4/IPv6 通用解析,必须用getnameinfo并传入NI_NUMERICHOST标志。容易被忽略的一点:
getaddrinfo分配的内存必须用freeaddrinfo释放,否则每次调用都泄漏 —— 这在循环解析中会迅速耗尽资源。
# node # windows # ipv6 # ai # c++ # ios # win # dns # cdn # stream # 为什么 # 字符串 # 递归 # 循环 # Struct # 负载均衡 # 多个 # 的是 # 转成 # 链表 # 第一个 # 适用于 # 这不是 # 不存在 # 可达
相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571 】
相关推荐: Win11怎么设置默认图片查看器_Windows11照片应用关联设置 如何在腾讯云服务器快速搭建个人网站? JavaScript Ajax实现异步通信 iOS中将个别页面强制横屏其他页面竖屏 nodejs redis 发布订阅机制封装实现方法及实例代码 Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势 Laravel如何实现API版本控制_Laravel API版本化路由设计策略 制作企业网站建设方案,怎样建设一个公司网站? laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法 香港网站服务器数量如何影响SEO优化效果? Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南 ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】 中山网站制作网页,中山新生登记系统登记流程? Laravel如何使用Livewire构建动态组件?(入门代码) Laravel PHP版本要求一览_Laravel各版本环境要求对照 如何在IIS服务器上快速部署高效网站? Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】 如何用PHP工具快速搭建高效网站? php json中文编码为null的解决办法 如何生成腾讯云建站专用兑换码? 装修招标网站设计制作流程,装修招标流程? 黑客如何通过漏洞一步步攻陷网站服务器? 最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢? Laravel如何实现文件上传和存储?(本地与S3配置) Firefox Developer Edition开发者版本入口 Laravel怎么实现验证码(Captcha)功能 Laravel如何配置任务调度?(Cron Job示例) 打造顶配客厅影院,这份100寸电视推荐名单请查收 大连企业网站制作公司,大连2025企业社保缴费网上缴费流程? Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程 魔毅自助建站系统:模板定制与SEO优化一键生成指南 phpredis提高消息队列的实时性方法(推荐) 如何快速生成凡客建站的专业级图册? 如何用狗爹虚拟主机快速搭建网站? 如何破解联通资金短缺导致的基站建设难题? 阿里云高弹*务器配置方案|支持分布式架构与多节点部署 Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析 如何在建站主机中优化服务器配置? Laravel如何处理CORS跨域请求?(配置示例) 极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异? ,在苏州找工作,上哪个网站比较好? laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法 原生JS实现图片轮播切换效果 javascript基于原型链的继承及call和apply函数用法分析 智能起名网站制作软件有哪些,制作logo的软件? BootStrap整体框架之基础布局组件 如何自定义建站之星网站的导航菜单样式? Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧 Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程 如何获取上海专业网站定制建站电话?


DNS 反查;但仅适用于已知地址族的场景(如上例限定