当前位置: 首页 > news >正文

【FileZilla】sftp协议的数据传输上传和下载

基于前面两篇及B站上大牛小方的解析视频:

 【1】【Filezilla】 dispatch函数重载的例子-CSDN博客

【2】【C++】【FileZilla】事件调用机制代码解析-CSDN博客

当线程entry()调用process_event()时,通过语句 (*std::get<0>(ev0))(*std::get<1>(ev0))调用operator 方法,当元组 ev0 的第零个元素 event_handler 类型匹配 CSftpControlSocket 时,语句调用重载的 CSftpControlSocket::operator() ,元组 ev0 的第一个元素 event_base 作为形参 ev传入operator(参考【2】),而当 ev 的实际类型匹配 CSftpEvent 时,实际调用下面重载的分发方法中的CSftpControlSocket::OnSftpEvent(参考【1】)。元组 ev 第零个元素的实际类型还有可能是 process_event, CCommandEvent

// In event_loop.hpp
typedef std::deque<std::tuple<event_handler*, event_base*, bool>> Events;// Events::value_type ev{};// In sftpcontrolsocket.cpp
void CSftpControlSocket::operator()(fz::event_base const& ev)
{if (fz::dispatch<fz::process_event, CSftpEvent, CSftpListEvent, SftpRateAvailableEvent>(ev, this,&CSftpControlSocket::OnProcessEvent,&CSftpControlSocket::OnSftpEvent,&CSftpControlSocket::OnSftpListEvent,&CSftpControlSocket::OnQuotaRequest)) {return;}CControlSocket::operator()(ev);
}

关注CSftpControlSocket::OnSftpEvent()方法:

void CSftpControlSocket::OnSftpEvent(sftp_message const& message)
{......switch (message.type){......case sftpEvent::Recv:......break;case sftpEvent::Send:......break;case sftpEvent::Transfer:......break;case sftpEvent::io_nextbuf:if (!operations_.empty() && operations_.back()->opId == Command::transfer) {auto & data = static_cast<CSftpFileTransferOpData&>(*operations_.back());data.OnNextBufferRequested(fz::to_integral<uint64_t>(message.text[0]));}break;case sftpEvent::io_open:if (!operations_.empty() && operations_.back()->opId == Command::transfer) {auto & data = static_cast<CSftpFileTransferOpData&>(*operations_.back());data.OnOpenRequested(fz::to_integral<uint64_t>(message.text[0]));}break;case sftpEvent::io_size:if (!operations_.empty() && operations_.back()->opId == Command::transfer) {auto & data = static_cast<CSftpFileTransferOpData&>(*operations_.back());data.OnSizeRequested();}break;case sftpEvent::io_finalize:if (!operations_.empty() && operations_.back()->opId == Command::transfer) {auto & data = static_cast<CSftpFileTransferOpData&>(*operations_.back());data.OnFinalizeRequested(fz::to_integral<uint64_t>(message.text[0]));}break;default:......}......
}

可以注意到其中 case sftpEvent::io_nextbuf 处理了数据的传输。

  • 上传:std::tie(r, buffer_) = reader_->get_buffer(*this);
  • 下载:auto r = writer_->add_buffer(std::move(buffer_), *this);
void CSftpFileTransferOpData::OnNextBufferRequested(uint64_t processed)
{if (reader_) {fz::aio_result r;std::tie(r, buffer_) = reader_->get_buffer(*this);if (r == fz::aio_result::wait) {return;}if (r == fz::aio_result::error) {controlSocket_.AddToSendBuffer("--1\n");return;}if (buffer_->size()) {controlSocket_.AddToSendBuffer(fz::sprintf("-%d %d\n", buffer_->get() - base_address_, buffer_->size()));}else {controlSocket_.AddToSendBuffer(fz::sprintf("-0\n"));}}else if (writer_) {buffer_->resize(processed);auto r = writer_->add_buffer(std::move(buffer_), *this);if (r == fz::aio_result::ok) {buffer_ = controlSocket_.buffer_pool_->get_buffer(*this);if (!buffer_) {r = fz::aio_result::wait;}}if (r == fz::aio_result::wait) {return;}if (r == fz::aio_result::error) {controlSocket_.AddToSendBuffer("--1\n");return;}controlSocket_.AddToSendBuffer(fz::sprintf("-%d %d\n", buffer_->get() - base_address_, buffer_->capacity()));}else {controlSocket_.AddToSendBuffer("--1\n");return;}
}

http://www.xdnf.cn/news/453565.html

相关文章:

  • 软考软件设计师中级——软件工程笔记
  • QT---信号与槽
  • scons user 3.1.2
  • hls 的使用方式
  • ICML-2024《Image Clustering with External Guidance》
  • PADS入门笔记【一】
  • 基于etcd的分布式任务调度系统:设计、实现与实战经验
  • CS016-2-unity ecs
  • 计算机系统结构——Cache性能分析
  • 苹果处理器“仿生“命名背后的营销策略与技术创新
  • 【ROS2】报错记录及对应解决方案
  • Open3D 体素化下采样
  • 当DeepSeek遇上百年医院:解码AI医疗落地实践
  • 香橙派/树莓派读取GY39数据
  • Spring Boot 日志
  • 仿真每日一练 | 多刚体动力学分析中的自由度问题
  • 领麦微红外温度传感器:发面机非接触测温
  • AI短期学习计划(持续完善更新)
  • 基于CETOL 6σ的生产不良判定与故障分析技术应用
  • Android Framework学习五:APP启动过程原理及速度优化
  • Made with Unity | 拓展“双点”宇宙版图
  • 再来1章linux系列-17 ssh sshd sshd非对称加密(密钥加密)‌SSH对称加密组件/流程
  • 树莓派3B+ wiringPi库安装
  • 【golang】网络数据包捕获库 gopacket
  • 用户模块 - IP归属地框架吞吐测试
  • 运维日志管理全解析:从存储优化到合规审计
  • LeetCode 题解 41. 缺失的第一个正数
  • 静电的起因与静电效应:技术分析与应用
  • svn status . 命令返回分析
  • 交易所功能设计的核心架构与创新实践