0

0

C++如何调用FTP服务器上传下载?(libcurl集成示例)

穿越時空

穿越時空

发布时间:2026-02-19 16:51:10

|

312人浏览过

|

来源于php中文网

原创

libcurl上传ftp失败主因是连接模式与认证配置错误:需强制被动模式(curlopt_ftp_use_pasv=1l)、单独设curlopt_userpwd、指定完整url路径;下载大文件须用流式写入回调并正确返回字节数;windows链接需匹配架构与ssl版本,上传前必设curlopt_upload再设大小。

c++如何调用ftp服务器上传下载?(libcurl集成示例)

libcurl上传文件到FTP服务器失败,常见报错CURLE_COULDNT_CONNECTCURLE_LOGIN_DENIED

连不上或认证失败,大概率不是代码逻辑问题,而是FTP连接模式和认证细节没对上。libcurl默认走主动模式(PORT),但大多数现代FTP服务器(尤其带NAT/防火墙的)只接受被动模式(PASV)。另外,ftp:// URL里写密码会被部分版本忽略,必须用curl_easy_setopt单独设CURLOPT_USERPWD

  • 强制启用被动模式:curl_easy_setopt(curl, CURLOPT_FTP_USE_EPSV, 0L)(禁用EPSV)+ curl_easy_setopt(curl, CURLOPT_FTP_USE_PASV, 1L)
  • 用户名密码别塞URL里,改用:curl_easy_setopt(curl, CURLOPT_USERPWD, "user:pass")
  • 如果服务器用FTP over TLS(FTPS),得加:curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL),并确保libcurl编译时启用了OpenSSL
  • 路径注意:FTP服务器根目录不一定是你登录用户的home,CURLOPT_UPLOAD前用CURLOPT_URL指定完整路径如ftp://host/path/to/file.txt,否则可能传到意外位置

下载大文件时卡住或内存暴涨,CURLOPT_WRITEFUNCTION回调怎么写才安全

直接用std::string拼接所有数据,几MB就OOM;不设CURLOPT_NOPROGRESS又可能被某些FTP服务器的进度响应干扰。关键在控制缓冲区粒度和避免拷贝。

  • 回调函数里别做字符串拼接,用std::vector<uint8_t></uint8_t>std::ofstream流式写入磁盘
  • 示例安全写法:
    size_t write_cb(void* ptr, size_t size, size_t nmemb, void* userdata) {
      std::ofstream* fp = static_cast<std::ofstream*>(userdata);
      size_t realsize = size * nmemb;
      fp->write(static_cast<char*>(ptr), realsize);
      return realsize;
    }
  • 务必检查返回值:libcurl要求回调返回**实际接收字节数**,少于size * nmemb会被视为传输中断
  • 下载前加curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L),避免FTP服务器发PROGRESS命令导致超时

Windows下编译链接libcurl失败,LNK2019: unresolved external symbol

不是头文件没包含,是libcurl的导入库(.lib)没连对,或者运行时DLL找不到。Windows的libcurl分静态/动态、带SSL/不带SSL多个版本,混用必炸。

橙篇
橙篇

百度文库发布的一款综合性AI创作工具

下载
  • 确认你用的是libcurl.lib(不是curldll.lib),且与你的编译器架构一致(x64项目不能链x86版lib)
  • 如果用了CURL_STATICLIB宏,必须定义:#define CURL_STATICLIB,且链接ws2_32.libwldap32.libcrypt32.lib(SSL版还需libssl.liblibcrypto.lib
  • 运行时报libcurl.dll missing?把对应DLL扔进exe同目录,或加到PATH——别指望系统路径有它
  • dumpbin /dependents your_app.exe查实际依赖了哪些DLL,比猜靠谱

上传后文件内容损坏或长度不对,CURLOPT_INFILESIZECURLOPT_UPLOAD顺序不能错

libcurl需要提前知道上传文件大小,否则FTP服务器可能截断或拒绝。但CURLOPT_INFILESIZE必须在CURLOPT_UPLOAD设为1L之后调用,否则无效。

立即学习C++免费学习笔记(深入)”;

  • 正确顺序:curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L)curl_easy_setopt(curl, CURLOPT_INFILESIZE, filesize)curl_easy_setopt(curl, CURLOPT_READFUNCTION, ...)
  • 如果文件大小不确定(比如管道输入),用CURLOPT_INFILESIZE_LARGECURL_OFF_T类型,并确保libcurl支持large file
  • 读回调里返回0表示结束,但别提前close文件句柄——libcurl会在传输完才释放资源
  • 上传后建议用CURLOPT_NOBODY + CURLOPT_HEADERFUNCTION发HEAD请求校验服务器端文件大小是否匹配

FTP协议本身没有事务和原子性,上传中途断开就是半截文件。真要可靠,得自己加MD5校验、断点续传逻辑,或者换SFTP(libssh2)。libcurl的FTP支持够用,但别把它当黑盒——每个curl_easy_setopt调用背后都有协议层含义。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

770

2023.08.02

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

116

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

359

2023.10.11

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

452

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

181

2023.10.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

573

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

216

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1553

2023.10.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP使用CURL抓取页面
PHP使用CURL抓取页面

共4课时 | 2.9万人学习

前端最全HTTP基础原理及应用
前端最全HTTP基础原理及应用

共12课时 | 1.8万人学习

C# 教程
C# 教程

共94课时 | 9.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号