curl_easy_perform 返回 CURLE_COULDNT_CONNECT 时,应优先检查协议前缀缺失、SSL库未链接、防火墙拦截端口,并启用CURLOPT_VERBOSE定位具体失败点;流式下载需用二进制fopen("wb")、正确设置CURLOPT_WRITEDATA与CURLOPT_WRITEFUNCTION并校验fwrite返回值;大文件须配置超时、低速限制及断点续传;Windows路径问题应使用_wfopen或Win32 API绕过fopen编码限制。

curl_easy_perform 返回 CURLE_COULDNT_CONNECT 怎么快速定位
网络不通、URL拼错、DNS失败都可能触发这个错误,但最常被忽略的是协议前缀缺失或端口被防火墙拦截。
-
https://和http://必须显式写出,curl_easy_setopt(handle, CURLOPT_URL, "example.com/file.zip")会直接失败 - 若目标是 HTTPS,确认已链接
libcurl的 SSL 后端(如-lcurl -lssl -lcrypto),否则静默降级为 HTTP 或报错 - 加一句
curl_easy_setopt(handle, CURLOPT_VERBOSE, 1L),错误输出里会明确显示“Failed to connect to …”,比只看返回码快得多
怎么用 FILE* + CURLOPT_WRITEDATA 实现边下边存,不全载入内存
这是最常用也最容易出错的流式写法——关键不是“能写”,而是“写完不丢数据”。
- 必须用二进制模式打开文件:
fopen("out.bin", "wb"),用"w"在 Windows 下会把\n换成\r\n,破坏二进制文件 -
CURLOPT_WRITEDATA要传入FILE*指针,不是文件名;同时必须设置CURLOPT_WRITEFUNCTION为你自己写的回调函数 - 回调函数签名必须是
size_t write_cb(void *ptr, size_t size, size_t nmemb, void *userdata),其中ptr是待写数据起始地址,size * nmemb是字节数,别直接用fwrite(ptr, 1, size * nmemb, fp)就完事——要检查返回值是否匹配,否则部分写入会导致文件损坏
下载大文件时卡住或超时,哪些 CURLOPT 设置不能漏
默认超时极短(约几分钟),且无进度反馈,大文件极易中断,而重试逻辑又不能靠 curl_easy_perform 自动完成。
-
CURLOPT_TIMEOUT控制总耗时,单位秒;CURLOPT_CONNECTTIMEOUT单独控连接阶段,建议设为 10–30 - 加
CURLOPT_LOW_SPEED_LIMIT和CURLOPT_LOW_SPEED_TIME防止“连上了但不动”:比如设1024和30,表示连续 30 秒下载速度低于 1KB/s 就断开 - 如果服务端支持断点续传,先用 HEAD 请求拿到
Content-Length,再用CURLOPT_RESUME_FROM接续写入已有文件,避免重复下载
Windows 下 fopen 失败但 Linux 正常?路径和编码问题怎么绕
不是 libcurl 的锅,是 fopen 在 Windows 上对 UTF-8 路径原生不友好,尤其含中文时。
立即学习“C++免费学习笔记(深入)”;
- 别用
std::string直接传给fopen,即使你本地编译用了 UTF-8 源码;Windows API 层面需要 UTF-16 - 简单方案:用
_wfopen替代fopen,把路径转成std::wstring(用std::mbstowcs或 C++11 的std::codecvt_utf8<wchar_t></wchar_t>) - 更稳的路:改用
open()+write()(POSIX)或CreateFileW()(Win32),彻底避开fopen的编码陷阱
流式下载真正难的不是调通接口,而是确保每一块数据都按序、完整、无损地落到磁盘上——中间任何一环没检查返回值,文件就废了。



















