You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++开发DNS查询工具:unsigned char数组转in6_addr打印IPv6异常

看起来你的代码里有几个关键问题导致IPv6地址输出不符合预期,我帮你拆解并修正:

1. 错误的内存拷贝长度

IPv6地址是128位=16字节,但你用memcpy拷贝了128字节,这会把过多的数据写入in6_addr结构体(它的s6_addr成员刚好是16字节的数组),直接导致结构体数据溢出、地址混乱。

2. 缓冲区大小参数不匹配

你给inet_ntop传的最后一个参数是128,但你的buf只有41字节——这会触发缓冲区溢出,导致内存损坏,输出结果自然不对。另外,IPv6字符串的最长长度(含终止符)是46字节,所以buf的大小建议设为46更稳妥。

修正后的代码

struct in6_addr tmp2;
char buf[46]; // 足够容纳最长的IPv6字符串(含'\0')

// 只拷贝16字节的IPv6地址,用sizeof避免硬编码错误
memcpy(tmp2.s6_addr, answ[i].rdata, sizeof(tmp2.s6_addr));

// 转换时传递正确的缓冲区大小,同时检查转换结果
const char* ipv6_str = inet_ntop(AF_INET6, &tmp2, buf, sizeof(buf));
if (ipv6_str != nullptr) {
    cout << answ[i].name << " IN AAAA " << ipv6_str << endl;
} else {
    cerr << "Failed to parse IPv6 address for " << answ[i].name << endl;
}

额外检查点

  • 确认answ[i].type是DNS的AAAA类型(数值为28),别误处理了A记录或其他类型的记录;
  • 确保answ[i].rdata指向的是纯IPv6地址数据——有些DNS解析库的rdata可能包含额外的字段(比如长度前缀),如果是这种情况,你需要把指针偏移对应长度后再拷贝。

内容的提问来源于stack exchange,提问作者Brykyz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:03:04