FTP 编程 5 文件传输与目录切换


    接下来说最后一个 FTP 实现的功能点了,文件传输加上前面几篇文件介绍的功能实现组合起来基本就能实现一个 FTP 程序了,但这个只是简单的实现,和现实中能使用的还有很多要完善,但现在的时间比较紧张,没有太多时间弄了,还有好多的东西要学。所以如果各位有兴趣的话,可以自己去完善,反正要用的基本就是这些,和其他组合一下,自己摸索完善一下,比如弄个图像界面之类的。

文件传输

    本文以客户端上传文件为例,但客户端下载原理基本雷同,会其一就能写出另外一个的。文件上传的大概如下:

  • l.首先客户端向服务端发送命令说明自己要想服务端上传文件了
  • 2.服务端收到客户端的命令,在本地创建相应的文件
  • 3.客户端再向服务端发送文件的大小信息,这个信息是非常有用的,用于服务端如何判断文件传输是否完毕
  • 4.服务端收到文件大小信息,用于统计
  • 5.客服端打开相应的文件进行读取传输,用一个循环,在循环里面每次读取1024字节并传输,也就是分段传输,不是一次性读取完并传完
  • 6.服务端用一个循环接收文件信息,每次接收1024字节(与客户端同步),并统计相应的剩下的文件大小,当文件大小等于小于0时传输完毕
  • 7.客户端读取完毕,关闭文件,等待下一命令
  • 8.服务端接收完毕,关闭并保存文件,等待客户端的下一个命令

    具体的代码如下:

客户端文件上传代码


bool Client::uploadFile(std::string filePath)
{//打开文件char* workPath = _getcwd(NULL, 0);if (workPath == NULL) {std::cout << "Get current work path failed\n";}else {std::cout << workPath << std::endl;}std::string absolutePath = workPath;absolutePath += "\\";absolutePath += filePath;//使用文件I/O进行读取,这样适用于所以类型文件std::ifstream file(absolutePath.c_str(), std::ios_base::binary);if (!file) {std::cout << "file open failed.\n";return false;}else {std::cout << "open successful\n";}//获取文件大小long fileBegin = file.tellg();file.seekg(0, std::ios_base::end);long fileEnd = file.tellg();int fileSize = fileEnd - fileBegin;std::cout << "File size is " << fileEnd-fileBegin << " bytes" << std::endl;//将文件大小发送给服务端_itoa_s(fileSize, buf, 10);send(client, buf, 1024, 0);//读取文件内容std::cout << "开始读取文件内容" << std::endl;file.seekg(0, std::ios_base::beg);int sendCount = 0;while(!file.eof()) {memset(buf, 0, 1024);file.read(buf, 1024);int len = send(client, buf, maxSize, 0);if (len == SOCKET_ERROR) {std::cout << "Sending occur error\n";}sendCount += 1024;std::cout << "Send " << sendCount << "/" << fileSize << " bytes\n";}//关闭文件file.close();std::cout << "Readed file succesful\n";return false;
}

服务端文件上传接收代码


bool Server::receiveFile(std::string filename)
{//创建与上次文件名相同的文件std::string filePath = storePath + filename;std::ofstream storeFile(filePath, std::ios_base::binary);if (!storeFile) {std::cout << "Create file failed\n";}//先接收文件大小信息memset(buf, 0, maxSize);recv(server, buf, 1024, 0);int fileSize = atoi(buf);std::cout << "File's size is:" << fileSize << std::endl;int len = 1;int recvCount = 0;//统计文件传输剩下的大小int remain = fileSize;while (true) {memset(buf, 0, maxSize);len = recv(server, buf, 1024, 0);storeFile.write(buf, 1024);if (len == SOCKET_ERROR) {std::cout << "Receive occur error\n";}//如果剩下的小于等于0,说明文件传输完毕,退出循环remain -= 1024;if(remain <= 0) {//if (strlen(buf) == 0) {break;}recvCount += strlen(buf);std::cout << "Receive " << recvCount << " bytes\n";}//关闭并保存文件storeFile.close();std::cout << "Write file successful\n";return false;
}

目录切换

    这个这里大概提一下就行,其实就是传输一些文字信息而已,就socket方面而已是没有多大难道的,只要在客户端和服务端建立相应的路径变量,进行相应的同步和保存即可。获取文件目录的信息需要用到Windows的目录处理,把处理后的目录信息存到字符串中,再发送到客户端,客户端再进行处理和显示就行

最后

    FTP的技术点大概就这些,祝各位玩的愉快

源码地址

源码地址

FTP 编程 5 文件传输与目录切换相关推荐

  1. 基于FTP协议的文件传输与下载

    目录 一.FTP协议: 二.文件上传: 1.连接服务器 2.登录操作 3.上传操作 三.文件下载 1.连接服务器 2.登录操作 3.下载操作 四. 总结: 一.FTP协议: ftp是(File Tra ...

  2. 使用第三方FTP软件进行文件传输的教程

    使用第三方FTP软件进行文件传输教程 这里以CuteFTP 9.0为例进行示范 首先去下载CuteFTP,下载安装完成后,打开软件,通过"文件"-"新建"-&q ...

  3. 配置ftp服务器实现文件传输,配置ftp服务器实现文件传输

    配置ftp服务器实现文件传输 内容精选 换一换 云堡垒机支持文件传输功能,以及审计传输的文件.Linux主机和Windows主机的文件传输方式有所区别.Linux主机上传/下载文件,可选择Web运维和 ...

  4. 巧用FTP命令进行文件传输

    巧用FTP进行文件传输 Internet作为现代信息高速公路已深入我们的生活,其中它所提供的电子邮件Web网站信息服务已被越来越多的人所熟知和使用.FTP作为Internet的功能之一,虽然没有像E- ...

  5. 计算机网络之应用层:3、文件传输协议FTP、简单文件传输协议TFTP

    应用层:3.FTP.TFTP FTP要解决的问题: 文件传输协议: FTP客户端和服务器: FTP工作原理: FTP要解决的问题: 1.不同计算机存储数据的格式不同 2.文件的目录结构和文件的命名规则 ...

  6. FTP协议(文件传输协议)

    FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Appl ...

  7. 教你写一个ftp协议(文件传输协议)

    一.FTP协议简介 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它 ...

  8. java socket 传多个文件下载,Socket编程多文件传输

    有子曰:"其为人也孝弟,而好犯上者,鲜矣:不好犯上,而好作乱者,未之有也.君子务本,本立而道生.孝弟也者,其为仁之本与!" 项目介绍:基于TCP协议实现多文件传输 将F盘test文 ...

  9. linux下通过串口ftp,eftp简单文件传输工具支持串口、网络、Windows、Linux、单片机平台-博客...

    在日常工作中,经会常遇到Windows PC机和Windows PC机之间.Windows PC机与Linux PC机之间.Windows PC机与嵌入式Linux板卡之间.Linux PC机与Lin ...

最新文章

  1. 使用JCIFS获取远程共享文件
  2. linux冒泡算法程序,用蛮力法解决冒泡排序 - linux-tao的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. python【数据结构与算法】深入浅出Linear(线性表)
  4. C语言中动态数组的作用,C语言实现动态数组
  5. 使用JPA映射实体类和数据库中表时,实体类中定义的enum类型,数据库定义的是varchar类型,为什么使用JPA插入时字段变成了Integer类型
  6. 策略模式(策略不同类,场景不同策略不同,环境策略分离组合)
  7. web模块化规范和实现
  8. swoole 协程channel乱测
  9. 【转载】 Asp.net Mvc 3当然也不会例
  10. 谷歌放弃C++语言,Python将要一统江湖了?
  11. 答题获得思科T-shirt
  12. 是该为硬核创新的寒武纪说句公道话了
  13. 音频录制和Speech语音识别(ios10)
  14. Android 反编译Apk (Mac)
  15. 计算广告中的名词解释
  16. 泛微云桥e-Bridge安装手册
  17. 计算机等级二级等保要求
  18. 怎么把小丑的可怕和疯狂表现出来
  19. 杭州购买油车流程笔记
  20. ios开发-分享一些免费的接口

热门文章

  1. [课程设计]任务进度条开发日志目录
  2. 中国剩余定理-模版(互质版)
  3. C#语言: 生成静态页面核心代码
  4. ASP.NET中常用功能代码总结(1)——发送邮件篇
  5. 零售连锁专卖信息化解决方案简介之一
  6. 关于PHP页面显示乱码问题的解决
  7. mount.nfs: Stale file handle的解决方法
  8. 【报告分享】2020年B站内容营销报告.pdf(附下载链接)
  9. 【报告分享】女性自我保护手册,教你应对10种常见危险处境.pdf(附189页pdf下载链接)...
  10. PyTorch 深度学习:33分钟快速入门——VGG