windows下使用vcpkg编译libcurl库并使用C++实现ftp上传下载功能

news2024/9/22 20:04:34

1、下载安装vcpkg

git clone https://github.com/microsoft/vcpkg

2、编译vcpkg

使用cmd命令

D:\Code\ThirdParty>cd vcpkg
D:\Code\ThirdParty\vcpkg>bootstrap-vcpkg.bat

3、使用vcpkg编译所需的库

进入vckpkg目录,使用vckpkg install 命令进行安装。在安装前可使用vcpkg search命令进行库的检索。

在这里插入图片描述

4、下载编译x64位的libcurl库

vcpkg install curl:x64-windows

之后在这个路径下可以获取到需要的动态库和静态库以及头文件,debug和release都有。

在这里插入图片描述

6、示例证明libcurl库被正确编译和使用

正确链接编译产生的库,该示例是显示网址的源码

#include <iostream>
#include "include/curl/curl.h"

int main()
{
	CURL* curl = curl_easy_init();
	if (curl)
	{
		curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
		curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
		CURLcode res = curl_easy_perform(curl);
		if (res != CURLE_OK)
		{
			fprintf(stderr, "curl_easy_perform() failed: %s\n",
				curl_easy_strerror(res));
		}
		curl_easy_cleanup(curl);
	}

	system("pause");
	return 0;
}

在这里插入图片描述

5、使用libcurl库进行ftp的上传和下载

#include <iostream>
#include "include/curl/curl.h"

// 回调函数,用于显示进度
size_t progress_callback(void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) 
{
	std::cout << "上传进度: " << ulnow << " / " << ultotal << std::endl;
	return 0;
}

int uploadFile(const std::string& ftpUrl, const std::string& localFilePath, const std::string& ftpUsername, const std::string& ftpPassword)
{
	CURL* curl;
	CURLcode res;

	curl_global_init(CURL_GLOBAL_DEFAULT);
	curl = curl_easy_init();

	if (curl) 
	{
		// 设置 FTP 上传地址
		curl_easy_setopt(curl, CURLOPT_URL, ftpUrl.c_str());

		// 设置用户名和密码
		curl_easy_setopt(curl, CURLOPT_USERNAME, ftpUsername.c_str());
		curl_easy_setopt(curl, CURLOPT_PASSWORD, ftpPassword.c_str());

		// 启用上传
		curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

		// 本地文件路径
		FILE* fp = fopen(localFilePath.c_str(), "rb");
		if (fp)
		{
			curl_easy_setopt(curl, CURLOPT_READDATA, fp);

			// 设置进度回调函数
			curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);

			res = curl_easy_perform(curl);

			fclose(fp);

			if (res != CURLE_OK)
				std::cerr << "上传失败: " << curl_easy_strerror(res) << std::endl;
			else
				std::cout << "上传成功" << std::endl;
		}
		else {
			std::cerr << "无法打开本地文件: " << localFilePath << std::endl;
		}

		curl_easy_cleanup(curl);
	}

	curl_global_cleanup();

	return 0;
}

// 回调函数,用于写入下载的数据
size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream) 
{
	size_t written = fwrite(ptr, size, nmemb, stream);
	return written;
}

int downloadFile(const std::string& ftpUrl, const std::string& savePath, const std::string& ftpUsername, const std::string& ftpPassword)
{
	CURL* curl;
	CURLcode res;
	FILE* fp;

	curl_global_init(CURL_GLOBAL_DEFAULT);

	curl = curl_easy_init();
	if (curl) 
	{
		fp = fopen(savePath.c_str(), "wb");

		curl_easy_setopt(curl, CURLOPT_URL, ftpUrl.c_str());
		curl_easy_setopt(curl, CURLOPT_USERNAME, ftpUsername.c_str());
		curl_easy_setopt(curl, CURLOPT_PASSWORD, ftpPassword.c_str());

		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

		res = curl_easy_perform(curl);

		fclose(fp);

		if (res != CURLE_OK)
			std::cerr << "下载失败: " << curl_easy_strerror(res) << std::endl;
		else
			std::cout << "下载成功" << std::endl;

		curl_easy_cleanup(curl);
	}

	curl_global_cleanup();

	return 0;
}

int main() 
{
	std::string ftpUrl = "ftp://192.168.1.5:21/2.png";	// ftp服务器的文件路径,不存在的文件会自动创建
	std::string localFilePath = "D:/2.png";				// 本地文件路径
	std::string ftpUsername = "2906141298@qq.com";		// 登录ftp服务器的用户名
	std::string ftpPassword = "Zhn258369.";				// 登录ftp服务器的密码

	// 上传
	uploadFile(ftpUrl, localFilePath, ftpUsername, ftpPassword);
	
	// 下载
	downloadFile(ftpUrl, localFilePath, ftpUsername, ftpPassword);

	system("pause");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OJ题——二叉树(最大深度/平衡二叉树/前序遍历构建)

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes &#x1f3c0;OJ题分享&#xff1a; Topic Sharing 题目一&#xff08;最大深度&#xff09; 利用分治的思想&…

饿了么新财年开门见喜:亏损减负,收入增肌

撰稿 | 行星 来源 | 贝多财经 8月15日&#xff0c;阿里巴巴对外发布2025财年一季度&#xff08;即自然年2024年二季度&#xff09;业绩。不难看出&#xff0c;受益于饿了么和高德订单的显著增长&#xff0c;以及市场营销服务收入的明显拉升&#xff0c;该季度本地生活集团成绩…

10.DMA

理论 12个通道&#xff1a;DMA1&#xff08;7&#xff09;DMA2&#xff08;5&#xff09; 方向&#xff1a;存储器和存储器间(DMA_MEMORY_TO_MEMORY)、外设到存储器(DMA_PERIPH_TO_MEMORY)、存储器到外设(DMA_MEMORY_TO_PERIPH) 闪存、 SRAM、外设的SRAM、 APB1、 APB2和AHB外…

Simple RPC - 05 从零开始设计一个客户端(下)_ 依赖倒置和SPI

文章目录 Pre概述依赖倒置原则与解耦设计与实现1. 定义接口来隔离调用方与实现类2. 实现类DynamicStubFactory3. 调用方与实现类的解耦 依赖注入与SPI的解耦依赖注入SPI&#xff08;Service Provider Interface&#xff09; 总结 Pre Simple RPC - 01 框架原理及总体架构初探 …

一个模型,多种作物:迁移学习如何提升设施农业AI模型效能

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;设施农业是现代农业的"压舱石",但传统的经验式管理模式已难以为继。在数字经济时代,设施农业亟需向数字化、网络化、智能化转型升级。以人工智能为代表的信息技术,正在为设施农业插上腾飞的翅膀。作为…

Kafka主题(Topic/文件夹)的操作

Kafka主题&#xff08;Topic/文件夹&#xff09;的操作 1、Kafka主题&#xff08;Topic/文件夹&#xff09;2、Kafka主题&#xff08;Topic/文件夹&#xff09;的一些操作2.1、创建主题&#xff08;Topic/文件夹&#xff09;2.2、列出所有主题&#xff08;Topic/文件夹&#xf…

8路VBO转HDMI2.0支持4K60频率ITE6265芯片方案心得分享

在此之前&#xff0c;有人找到我这边询问能不能将智能电视主板改成机顶盒&#xff0c;将VBO信号转换输出位HDMI进行投屏&#xff0c;具体应用奇奇怪怪&#xff01;但是奈何是甲方大佬。认命照做。从网上也有搜索了解过这类芯片&#xff0c;发现资料很少&#xff0c;所以有了这篇…

基于免疫算法的最优物流仓储点选址方案MATLAB仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于免疫算法的最优物流仓储点选址方案MATLAB仿真。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序运行后无水印&#xff09; 3…

STM32标准库学习笔记-1.基础知识

STM32介绍&#xff1a; STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。 ARM的含义&#xff1a; 公司名称&#xff1a;ARM公司成立于1990年&#xff0c;全称是Advanced RISC Machines&#xff08;RISC:Reduced Instruction Set Computer 精简指令集计算机 相对应有C…

C++票据查验、票据ocr、文字识别

现在&#xff0c;80、90后的人们逐渐过渡为职场上的主力人员&#xff0c;在工作中当然也会碰到各种各样的问题。比如&#xff0c;当你的老板给你一个艰难的任务时&#xff0c;肯定是不能直接拒绝的。那么我们该怎么做呢&#xff1f;翔云建议您先认真考虑老板说的任务的难度&…

C语言日常练习 Day17

目录 一、找出一个二维数组的鞍点 二、有一篇文章&#xff0c;共有3行文字&#xff0c;每行有80个字符。要求分别统计出其中的英文大写字母、小写字母、数字、空格以及其他字符的个数 三、有一行电文&#xff0c;已按下面规律编译成密码&#xff1a;A->Z,a->z,B->Y,…

mp3格式转换器推荐哪个?音质无损转换新选择

暑假在家&#xff0c;想要自己学着制作独一无二的彩铃吗&#xff1f;首先得解决音乐格式的难题。 面对众多mp3格式转换app&#xff0c;你是否也在犹豫“mp3格式转换app常用哪个&#xff1f;” 别担心&#xff0c;热门mp3格式转换工具大盘点来袭&#xff0c;帮你轻松搞定格式转…

《深入浅出WPF》读书笔记.5控件与布局(上)

《深入浅出WPF》读书笔记.5控件与布局(上) 背景 深入浅出WPF书籍学习笔记附代码。WPF中数据是核心是主动的,UI是数据的表达是被动的。 程序的本质是数据算法&#xff1b;控件的本质是数据行为&#xff1b; 5.控件与布局 一、6类控件派生关系 1.布局控件:可以容纳多个控件…

为什么神经网络常常是linear+relu的堆叠

特征提取&#xff1a;每一层的线性变换可以看作是在提取输入数据的不同特征。通过堆叠多个这样的层&#xff0c;网络能够学习从原始数据中提取越来越复杂的特征表示非线性关系&#xff1a;单个神经元的线性变换是线性的&#xff0c;但通过引入非线性激活函数&#xff08;例如Re…

重生奇迹MU 百变职业 打造属于你的专属职业

重生奇迹MU让每个玩家都能够在这里打破常规、展示个性&#xff0c;以自己的方式创造专属的游戏体验。其中的加点玩法是最为重要的部分之一&#xff0c;它不仅在角色成长过程中发挥着重要作用&#xff0c;还能够激发玩家的想象力&#xff0c;让他们自由设计全新的玩法。同样一个…

美股收涨,半导体板块领涨;苹果iPhone出货预测上调

市场概况 在昨夜的交易中&#xff0c;美股三大股指全线收涨。道琼斯工业平均指数上涨1.39%&#xff0c;纳斯达克综合指数上涨2.34%&#xff0c;标准普尔500指数上涨1.61%。值得注意的是&#xff0c;英伟达股票涨幅近4%&#xff0c;推动了科技股的整体表现。美国十年期国债收益…

【W1】记录文档

标题 导出数据结构关系结构YOLOVOCLabelMeCOCOJSON可视化 导出数据结构 关系结构 任务 -> 批次 -> 条目 -> 帧YOLO 一张图片对应一个文本文件 .txt<object-class> <x> <y> <width> <height>归一化处理找到物体在图像中的中心点的 x&a…

018、钩子函数 mounted和beforeDestroy、父组件向子组件传递参数 props 的使用

文章目录 1、mounted 和 beforeDestroy1.1、mounted1.2、beforeDestroy 2、父组件向子组件传递参数 props2.1、子组件定义2.2、父组件调用子组件并传参 3、完整例子3.1、父组件 Tags.vue3.2、子组件 TagsMenu.vue3.3、效果图 1、mounted 和 beforeDestroy 1.1、mounted mount…

人类是怎样提取特征并学习和表达复杂的模式的?

人类提取特征、学习和表达复杂模式的过程涉及多方面的认知和神经机制。一些关键步骤和机制涉及&#xff1a; 感知是人类获取外部信息的过程。通过感官&#xff08;视觉、听觉、触觉等&#xff09;&#xff0c;人类可以接触到各种数据。注意力机制帮助我们从大量信息中筛选出重要…

Trying to Insert an input function using Python in OpenAI

题意&#xff1a;尝试在 OpenAI 中使用 Python 插入一个输入函数 问题背景&#xff1a; import os import openai openai.api_key API_Key Question "\\n\\nQ: input("Enter Question")?\\nA:", response openai.Completion.create( model"text-…