文章目录

  • 下载:
    • 下载的过程:
      • 单文件传输:
      • 多文件传输:

下载:

如下图:

  1. 如果刚发完size,客户端不回复ok,直接发送数据,会出现粘包问题
  2. 如果想要确保客户端收到数据,可以每发送一个数据,客户端回复一个ok。

下载的过程:

单文件传输:

  1. 客户端发送 get a.c 给服务器
  2. 服务器查看其目录中是否a.c文件
  3. 如果有,回复ok,并将a.c文件的大小发送给客户端。(用来提示客户端什么时候下载完),否则回复error (名字错误,没有找到等等错误)
  4. 客户端收到服务器的确认,并回复服务器ok。
  5. 服务器开始发送数据。(一次或多次)

多文件传输:

  1. 客户端发送 get a.c b.c给服务器
  2. 服务器查看其目录中是否a.c b.c文件
  3. 如果有,回复ok。
  4. 客户端收到服务器的确认,创建2个链接,专门负责a.c 和b.c文件的传输,并回复服务器ok。(直到链接关闭,说明文件传输完了)
  5. 服务器开始发送数据。(一次或多次)

lseek:获取文案描述符的偏移量(文件大小)
服务器 thread.c

void send_file(int c,char *filename)
{if(filename == NULL){send(c,CMD_ERR,strlen(CMD_ERR),0);return;}int fd = open(filename,O_RDONLY);if(fd == -1){send(c,FILE_ERR,strlen(FILE_ERR),0);return;}//lseek,将文件的偏移量指针末尾int filesize = lseek(fd,0,SEEK_END);lseek(fd,0,SEEK_SET);//将文件偏移指针移动到文件开始char buff_size[64] = {0};sprintf(buff_size,"ok#%d",filesize);send(c,buff_size,strlen(buff_size),0);//发送文件大小memset(buff_size,0,64);int n = recv(c,buff_size,63,0);if ( n <= 0 ){return;}if ( strcmp(buff_size,"err") == 0 ){return;}char data[1024];int num = 0;//读取文件内容while( (num = read(fd,data,1024)) > 0 ){send(c,data,num,0);}close(fd);return;
}

客户端:

//cmd_buff : get a.c
void recv_file(int c, char cmd_buff[], char* filename)
{if(cmd_buff == NULL || filename == NULL){return;}send(c,cmd_buff,strlen(cmd_buff),0);char buff[64] = {0};int  num = recv(c,buff,63,0);if(num <= 0){printf("ser close or err\n");return;} //ok#size  ,有数据就可以写数据int filesize = 0;sscanf(buff+3,"%d",&filesize);printf("文件:%s,大小:%d\n",filename,filesize);if ( filesize < 0 ){send(c,"err",3,0);return;}int fd = open(filename,O_CREAT|O_WRONLY,0600);if ( fd == -1 ){printf("创建文件失败\n");send(c,"err",3,0);return;}send(c,"ok",2,0);char data[1024];int curr_size = 0;while( 1 ){int n = recv(c,data,1024,0);if ( n <= 0 ){printf("down file err\n");break;}write(fd,data,n);curr_size += n;float f = curr_size * 100.0 / filesize;printf("当前下载:%.2f%%\r",f);fflush(stdout);if ( curr_size >= filesize ){break;}}close(fd);printf("\n");printf("文件下载完成\n");return ;}

【文件传输】实现下载相关推荐

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

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

  2. python局域网大文件_[源码]Python简易http服务器(内网渗透大文件传输含下载命令)...

    Python简易http服务器源码 import SimpleHTTPServer import SocketServer import sys PORT = 80 if len(sys.argv) ...

  3. feem v4 Android,Feem app下载-Feem安卓版(文件传输工具)下载 v4.3.2_5577安卓网

    Feem app推荐给需要一款文件传输软件的用户,app支持多个平台之间传输,而且传输速度超快,非常适合传输较大的软件,即使是这样也完全不卡顿,只要将设备放置同一个无线网络下就能进行传输. [软件介绍 ...

  4. Linux 命令之 curl -- 文件传输工具/下载工具/网络接口调试

    文章目录 一.命令介绍 二.常用选项 三.wget 与 curl 对比 四.命令示例 (一)以 post 方式提交数据/以 post 方式传递请求参数 (二)查看网页的源码内容 (三)保存访问的网页源 ...

  5. [转]文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1

    转自:http://blog.csdn.net/soarheaven/archive/2008/12/08/3474152.aspx 最近项目需要对FTP服务器进行操作,现把实现总结如下: 打算分2篇 ...

  6. python下载文件传到服务器_python实现FTP文件传输的方法(服务器端和客户端)

    用python实现FTP文件传输,包括服务器端和客户端,要求 (1)客户端访问服务器端要有一个验证功能 (2)可以有多个客户端访问服务器端 (3)可以对重名文件重新上传或下载 FTP(File Tra ...

  7. Linux的文件传输工具(WinSCP)付下载连接

    本简介,WinSCP是一个支持SSH的SCP文件传输软件.WinSCP中文版体积小.占用系统资源少.操作简单,只需要连接相应的服务器就可以进行下载和传输文件.重要的是WinSCP中文版软件还有着很多特 ...

  8. python下载文件传到服务器_python实现FTP文件传输(服务器端和客户端)

    用python实现FTP文件传输,包括服务器端和客户端,要求 (1)客户端访问服务器端要有一个验证功能 (2)可以有多个客户端访问服务器端 (3)可以对重名文件重新上传或下载 FTP(File Tra ...

  9. Microsoft .NET Framework 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1...

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

最新文章

  1. java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)
  2. 动态线条,随鼠标移动吸附效果
  3. 导演李大为婚礼全过程(二)
  4. linux静态路由添加自启动,LINUX添加静态路由
  5. MacOS 好用的插件和图形界面程序
  6. enum java 比较_Kotlin与Java比较:枚举类
  7. mysql添加外键约束的两种方式(重要)
  8. Linux下ps命令详解
  9. 技术文档(3)--查看和修改Linux服务器的时区和时间
  10. Flex事件机制(三)
  11. selenium中CSS选择器定位
  12. 怎么查询sybase money列数据长度_用PBI分析上市公司财务数据(一)
  13. CodeForces 453A Little Pony and Expected Maximum
  14. 编译linux内核成vmlinuz,内核编译之vmlinuz vmlinux system.map initrd
  15. linux下如何查看二进制文件,Linux二进制文件的查看方法
  16. Linux内核学习(八):linux内核配置与模块
  17. android设置闹钟组件,Android 设置系统闹钟
  18. 服务器黑屏只显示鼠标是什么意思,电脑黑屏只显示鼠标怎么办
  19. 人工智能第八章答案神经网络,神经网络简答题
  20. CSDN聊ChatGPT

热门文章

  1. 我是Java,这是我的2019年总结,请查收!
  2. 水晶球 | 贪心、排序
  3. 副高职称论文发表要求
  4. Redis 6.2 sentinel判断主观下线和客观下线(源码)
  5. Linux 硬盘分区、分区命名和分区格式化
  6. 经典编译器组成(前端+优化器+后端)以及LLVM和Clang简介
  7. 大豆 NLR 基因与大豆抗病性
  8. 什么是Manacher(马拉车)算法-java代码实现
  9. 用于深层时空图建模的 Graph WaveNet
  10. Linux-Audio Codec