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 】
相关推荐: 香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化 Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置 如何在云主机上快速搭建网站? Python文本处理实践_日志清洗解析【指导】 Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势 高防服务器:AI智能防御DDoS攻击与数据安全保障 Python进程池调度策略_任务分发说明【指导】 如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】 如何制作一个表白网站视频,关于勇敢表白的小标题? 零基础网站服务器架设实战:轻量应用与域名解析配置指南 如何在IIS服务器上快速部署高效网站? html文件怎么打开证书错误_https协议的html打开提示不安全【指南】 电商网站制作价格怎么算,网上拍卖流程以及规则? 高防服务器租用指南:配置选择与快速部署攻略 nginx修改上传文件大小限制的方法 网站制作企业,网站的banner和导航栏是指什么? PHP正则匹配日期和时间(时间戳转换)的实例代码 JS经典正则表达式笔试题汇总 如何用AI帮你把自己的生活经历写成一个有趣的故事? Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边) 简单实现Android文件上传 如何快速打造个性化非模板自助建站? HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】 作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】 如何在IIS7上新建站点并设置安全权限? Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】 Bootstrap CSS布局之列表 高配服务器限时抢购:企业级配置与回收服务一站式优惠方案 头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站? Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】 SQL查询语句优化的实用方法总结 网站制作软件免费下载安装,有哪些免费下载的软件网站? 无锡营销型网站制作公司,无锡网选车牌流程? Laravel如何保护应用免受CSRF攻击?(原理和示例) 如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗? Java垃圾回收器的方法和原理总结 三星网站视频制作教程下载,三星w23网页如何全屏? 韩国服务器如何优化跨境访问实现高效连接? HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】 Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践 制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站? 如何基于云服务器快速搭建个人网站? Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能 Laravel事件监听器怎么写_Laravel Event和Listener使用教程 ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集 如何用腾讯建站主机快速创建免费网站? 如何有效防御Web建站篡改攻击? Laravel如何使用Gate和Policy进行授权?(权限控制) Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程 儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?


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