C++使用Poco库封装一个FTP客户端类

0x00 Poco库中 Poco::Net::FTPClientSession

Poco库中FTP客户端类是 Poco::Net::FTPClientSession , 该类的接口比较简单。

  1. 上传文件接口: beginUpload() , endUpload()
  2. 下载文件接口: beginDownload() , endDownload()

0x01 FTPCli类说明

  • FTPCli类实现了连接FTP服务器,断开连接,上传文件和下载文件。
  • 下载文件有两个接口,第一个接口从FTP服务器下载文件使用FTP服务器中的文件名,第二个接口是一个重载函数,可以将需要下载文件重新命名。

0x02 FTPCli类代码

#ifndef FTPCLI_H
#define FTPCLI_H#include <Poco/Poco.h>
#include <Poco/Exception.h>
#include <Poco/Net/FTPClientSession.h>
#include <string>class FTPCli
{
public:FTPCli(const std::string &host, const unsigned short port, const std::string &user, const std::string &passwd);~FTPCli();bool Connect(int retryCount = 3);void DisConnect();bool UploadFile(const std::string &localFilePath, const std::string &remoteFilePath);bool DownloadFile(const std::string &remoteFile);bool DownloadFile(const std::string &remoteFile, const std::string &localFile);private:Poco::Net::FTPClientSession m_ftpSession;std::string m_host;unsigned short m_port;std::string m_user;std::string m_passwd;
};#endif // FTPCLI_H

#include "ftpcli.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <Poco/Path.h>FTPCli::FTPCli(const std::string &host, const unsigned short port, const std::string &user, const std::string &passwd): m_host(host), m_port(port), m_user(user), m_passwd(passwd)
{char ftpUrl[128];sprintf(ftpUrl, "ftp://%s:%s@%s:%d/", m_user.c_str(), m_passwd.c_str(),m_host.c_str(), m_port);printf("[%s:%d] %s\n", __FILE__, __LINE__, ftpUrl);
}FTPCli::~FTPCli()
{DisConnect();
}bool FTPCli::Connect(int retryCount)
{while (retryCount > 0){try{if (!m_ftpSession.isOpen()){m_ftpSession.open(m_host, m_port);}if (!m_ftpSession.isLoggedIn()){m_ftpSession.login(m_user, m_passwd);}printf("WorkingDirectory: %s\n", m_ftpSession.getWorkingDirectory().c_str());printf("%s\n", m_ftpSession.welcomeMessage().c_str());return true;}catch (Poco::Exception &ex){printf("Error connecting to FTP server: %s\n", ex.what());--retryCount;if (retryCount > 0){char errlog[128];sprintf(errlog, "ftp://%s:%s@%s:%d/", m_user.c_str(), m_passwd.c_str(),m_host.c_str(), m_port);printf("Retrying connect %s...\n", errlog);}}}// throw std::runtime_error("Failed to connect to FTP server after multiple attempts.");return false;
}void FTPCli::DisConnect()
{try{if (m_ftpSession.isOpen()){m_ftpSession.close();}}catch (Poco::Exception &ex){printf("Error: %s\n", ex.what());}
}bool FTPCli::UploadFile(const std::string &localFilePath, const std::string &remoteFilePath)
{try{// 设置FTP服务器的工作目录m_ftpSession.setWorkingDirectory(remoteFilePath);std::ifstream inFile(localFilePath, std::ios::in);if (!inFile.is_open()){printf("Failed to open file: %s\n", localFilePath.c_str());return false;}Poco::Path tmpPath(localFilePath);std::string tmpFileName = tmpPath.getBaseName();printf("[%s:%d] FileBaseName: %s\n", __FILE__, __LINE__, tmpFileName.c_str());auto &res = m_ftpSession.beginUpload(tmpFileName);std::string line;while (std::getline(inFile, line)){res << line;}inFile.close();m_ftpSession.endUpload();}catch (const Poco::Exception &ex){printf("Error connecting to FTP server: %s\n", ex.displayText().c_str());m_ftpSession.endUpload();return false;}return true;
}bool FTPCli::DownloadFile(const std::string &remoteFile)
{try{std::ofstream outFile(remoteFile, std::ios::out | std::ios::app);if (!outFile.is_open()){printf("Failed to open file: %s\n", remoteFile.c_str());return false;}auto &res = m_ftpSession.beginDownload(remoteFile);std::string line;while (std::getline(res, line)){outFile << line;}outFile.close();m_ftpSession.endDownload();}catch (const Poco::Exception &ex){printf("Error: %s\n", ex.displayText().c_str());m_ftpSession.endDownload();return false;}return true;
}bool FTPCli::DownloadFile(const std::string &remoteFile, const std::string &localFile)
{try{std::ofstream outFile(localFile, std::ios::out | std::ios::app);if (!outFile.is_open()){printf("Failed to open file: %s\n", localFile.c_str());return false;}auto &res = m_ftpSession.beginDownload(remoteFile);std::string line;while (std::getline(res, line)){outFile << line;}outFile.close();m_ftpSession.endDownload();}catch (const Poco::Exception &ex){printf("Error: %s\n", ex.displayText().c_str());m_ftpSession.endDownload();return false;}return true;
}

0x03 使用介绍

在这里插入图片描述

C++ Poco库同样可以轻松的实现SFTP客户端和TFTP客户端。

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

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

相关文章

CSS规则——font-face

font-face 什么是font-face&#xff1f; 想要让网页文字千变万化&#xff0c;仅靠font-family还不够&#xff0c;还要借助font-face&#xff08;是一个 CSS 规则&#xff0c;它允许你在网页上使用自定义字体&#xff0c;而不仅仅是用户系统中预装的字体。这意味着你可以通过提…

jemeter基本使用

后端关验签&#xff0c;设置请求头编码和token 配置编码和token

Linux安装minio及mc客户端(包含ARM处理器架构)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

练习实践:ubuntu18.04安装、配置Nginx+PHP环境,两种配置方式,多站点

参考来源&#xff1a; https://help.aliyun.com/document_detail/464753.html https://www.cnblogs.com/laosan007/p/12803287.html https://blog.csdn.net/qq_55364077/article/details/132207083 【安装同版本7.2的php】 需要知道对应php和nginx的安装版本 需要安装php-fpm…

<sa8650>QCX Usecase 使用详解—如何在 QCX 框架中添加新的自定义Usecase/Pipeline

<sa8650>QCX Usecase 使用详解—如何在 QCX 框架中添加新的自定义Usecase/Pipeline 一、前言二、为 Usecase/Pipeline 创建新文件夹三、Create Usecase XML四、为 camxAutoo_Test 管道创建拓扑五、添加Usecase/Pipeline编译六、 使用 Qcarcam_Test 应用程序运行Usecase一、前…

【总线】AXI4第五课时:信号描述

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

【高性能计算笔记】

第1章 - 高性能计算介绍 1. 概念&#xff1a; 高性能计算(High performance computing&#xff0c;缩写HPC)&#xff1a; 指通常使用很多处理器&#xff08;作为单个机器的一部分&#xff09;或者某一集群中组织的几台计算机&#xff08;作为单个计算资源操作&#xff09;的…

零门槛用AI,302.AI让人工智能变得简单易用

当下人工智能火爆&#xff0c;提到AI&#xff0c;几乎每个人都能说上几句&#xff0c;但是你真的会使用AI吗&#xff1f; 当涉及到如何实际使用AI时&#xff0c;许多人可能会觉得它太过高深莫测&#xff0c;从而产生一种距离感&#xff0c;不知如何开始。我和大家也一样&#x…

Android性能优化-内存优化

&#xff11;、为什么进行内存优化&#xff08;如果不进行内存优化&#xff09; APP运营内存限制&#xff0c;OOM导致APP崩溃 APP性能&#xff0c;流畅性&#xff0c;响应速度和体验 2、Android内存管理方式: Android系统内存分配与回收方式 APP内存限制机制 切换应用时&…

AGV选型要点及步骤,保证企业选择的AGV小车更实用

AGV AGV小车作为智能化物流仓储不可或缺的工具&#xff0c;在制造业得到了广泛的应用&#xff0c;市场需求呈现出井喷式增长。但是AGV市场还存在着很多问题&#xff0c;制造企业在产品选型时往往缺乏正确的引导。 AGV智能仓储 毫无疑问,我们的自动化物流系统已离不开AGV小车了,…

链在一起Chained Together没中文 超好用的一键汉化工具推荐

《链在一起》一款新的可联机冒险跑酷类游戏&#xff0c;游戏里玩家将与你的同伴被链在一起&#xff0c;然后开始你的旅程&#xff0c;在地狱的深处&#xff0c;任务是通过尽可能高的攀登逃离地狱。 每一次跳跃都需要完美的协调才能攀上平台并逃离灼热&#xff0c;穿越众多世界&…

服务器win10server,python安装paddleocr的踩坑日记

最近由于需要图像文字识别的简单业务&#xff0c;研究了一下&#xff0c;一是用大厂的文字识别api&#xff0c;如百度腾讯等&#xff0c;但这种免费版只有有限的调用次数&#xff0c;如百度只有每月只有1000次调用额度&#xff0c;个人也够用&#xff0c;但由于业务量大&#x…

深入测评:ONLYOFFICE 8.1 桌面编辑器究竟有多强大?

ONLYOFFICE 8.1桌面编辑器 文章目录 ONLYOFFICE 8.1桌面编辑器一、ONLYOFFICE的简介二、ONLYOFFICE 8.1新功能和改进2.1 轻松编辑器 PDF 文件2.2 用幻灯片版式快速修改幻灯片2.3 无缝切换文档编辑、审阅和查看模式2.4 改进从右至左语言的支持 & 新的本地化选项2.5 隐藏“连…

【权威发布】2024年文化、设计与社会科学国际会议(ICCDSS 2024)

2024年文化、设计与社会科学国际会议 2024 International Conference on Culture, Design, and Social Sciences 会议简介 2024年文化、设计与社会科学国际会议旨在为全球范围内的专家学者提供一个交流文化、设计与社会科学研究成果的平台。会议将围绕文化、设计与社会科学的前…

超越AnimateAnyone, 华中科大中科大阿里提出Unimate,可以根据单张图片和姿势指导生成视频。

阿里新发布的UniAnimate&#xff0c;与 AnimateAnyone 非常相似&#xff0c;它可以根据单张图片和姿势指导生成视频。项目核心技术是统一视频扩散模型&#xff0c;通过将参考图像和估计视频内容嵌入到共享特征空间&#xff0c;实现外观和动作的同步。 相关链接 项目&#xff1…

Scala入门【安装与使用、变量与数据类型、运算符、函数、条件判断、循环、字符串、面向对象、数组】

视频地址:Scala大专/本科专用课程_哔哩哔哩_bilibili 目录 P01【01Scala安装与使用】16:15 P02【02变量与数据类型】17:14 P03【03运算符】12:41 P04【04函数】16:40 P05【05条件判断】10:56 P06【06循环】13:33 P07【07字符串】19:09 P08【08面向对象】17:27 P09【0…

DVWA-CSRF-samesite分析

拿DVWA的CSRF为例子 接DVWA的分析&#xff0c;发现其实Impossible的PHPSESSID是设置的samesite1. 参数的意思参考Set-Cookie SameSite:控制 cookie 是否随跨站请求一起发送&#xff0c;这样可以在一定程度上防范跨站请求伪造攻击&#xff08;CSRF&#xff09;。 下面用DVWA CS…

使用Python进行数据分析和自动化

组织严重依赖数据分析和自动化来提高运营效率。在本文中&#xff0c;我们将使用 Python&#xff08;一种用于通用编程的高级编程语言&#xff09;的示例来研究数据分析和自动化的基础知识。 什么是数据分析&#xff1f; 数据分析是指检查、清理、转换和建模数据的过程&#xf…

FydeOS导入VMware虚拟机之后,如何扩展系统硬盘大小?

前言​ 最近查询FydeOS系统的小伙伴不在少数啊&#xff01;可见这个系统是相当nice的&#xff0c;小伙伴们都是尝试尝试。 看到有不少小伙伴通过VMware虚拟机使用FydeOS&#xff0c;那么你就肯定知道官方包导入VMware之后&#xff0c;硬盘只显示分区了20GB。 如果这时候使用Fy…

物理服务器会不会被DDOS攻击?

物理服务器同样可能遭受分布式拒绝服务&#xff08;DDoS&#xff09;攻击。DDoS攻击的目的是通过大量的请求淹没目标服务器或网络&#xff0c;使其无法处理合法用户的请求&#xff0c;从而导致服务不可用。这种攻击并不区分服务器是物理的还是虚拟的&#xff0c;只要服务器连接…