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

Raspberry Pi Pico W启用strcpy转换DNS后HTTP GET请求超时问题

问题分析与解决
  • 核心问题出在strncpy的特性上:这个函数不会自动在目标缓冲区末尾添加字符串终止符'\0'。如果你的std::string长度刚好等于目标char数组的长度,复制后缓冲区没有终止符,lwIP在解析域名时会读取到缓冲区之外的垃圾数据,导致域名解析失败,最终HTTP请求超时。而硬编码的字符串本身自带终止符,所以能正常工作。

修复方案

方法1:手动补全终止符

复制完成后,手动在缓冲区最后一个位置添加'\0',确保字符串正确终止:

strncpy(m_server, tcpIpServer.c_str(), sizeof(m_server) - 1);
m_server[sizeof(m_server) - 1] = '\0'; // 强制添加终止符,预留一个字节避免溢出

方法2:直接使用std::string的c_str()(更推荐)

既然已经用std::string存储域名,没必要转成char数组,直接把tcpIpServer.c_str()传给lwIP的相关函数即可——c_str()返回的是带终止符的const char*,完全符合lwIP的参数要求:

// 示例:传给lwIP的域名解析函数
dns_gethostbyname(tcpIpServer.c_str(), &ip_addr, dns_found_callback, NULL);

方法3:用strlcpy替代strncpy(环境支持的话)

如果你的开发环境支持BSD风格的strlcpy,它会自动添加终止符并返回复制的长度,比strncpy更安全:

strlcpy(m_server, tcpIpServer.c_str(), sizeof(m_server));

额外建议

  • 把域名作为类成员属性是合理的设计,不用硬编码在函数里,只要处理好字符串终止符就能正常工作。
  • 调试时可以打印转换后的char数组内容,检查是否存在乱码或缺少终止符的情况,方便快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:30:01