【文件传输】实现下载

news2025/7/7 21:38:49

文章目录

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

下载:

如下图:

  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 ;

}

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

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

相关文章

流行的前端开源报表工具有哪些?适合在企业级应用的

前端开源报表工具有很多&#xff0c;但是如果是企业级应用真心不建议选用。比如非要选择开源的报表工具&#xff0c;你需要投入一个或多个程序员来做这个事情&#xff0c;他们还得先学习这个开源报表工具的界面、功能使用操作等等&#xff0c;尤其是很多开源工具的学习资料还是…

dpdk Vhost 库

1、 怎么实现vhost_dev的VhostOps的vhost_set_vring_kick和vhost_set_vring_call&#xff1b; vhost_net kernel方式的vhost_set_vring_kick和vhost_set_vring_call依赖于/dev/vhost_net的ioctl。 有两种实现方式&#xff1a; 1、guest是server&#xff0c;dpdk vhost user是…

Sourcetree的实际使用开发笔记

目录 前言 一、Sourcetree是什么 二、Sourcetree使用步骤 1.创建仓库 2.拉取和推送的使用 3.创建新的自己的分支 三、使用Sourcetree来进行不提交本地的代码&#xff0c;而获取最新的代码拉取 总结 前言 本章主要是记录一下Sourcetree的基本使用功能。 一、Sourcetree是…

Android:Binder思考笔记

基础知识 进程空间划分 一个进程空间分为用户空间与内核空间。用户空间与内核空间都是虚拟内存&#xff0c;映射到物理内存。所有进程的内核空间映射到同一块物理内存&#xff0c;是共享的二者区别&#xff1a; 进程间&#xff0c;用户空间的数据不可共享&#xff0c;即用户空…

线性与树型数据结构可视化模拟器

线性与树型数据结构可视化模拟器 题目2:线性与树型数据结构可视化模拟器 [问题描述] 数据结构课程是计算机类专业的核心课程之一&#xff0c;是计算机科学与技术必修的专业基础课程。数据结构研究的范围和计算机软件有着密切的联系。课程涉及到大量的概念、定义以及数据结构的…

JS数据类型的探究

JS数据类型的探究 分思考三部曲? 是什么?为什么?怎么做? 一:什么是数据类型? 在程序设计的类型系统中&#xff0c;数据类型&#xff08;英语&#xff1a;Data type&#xff09;&#xff0c;又称资料型态、资料型别&#xff0c;是用来约束数据的解释。在编程语言中&…

我去面试聊了半天MySQL索引,结果面试官黑脸让我回家等结果...

V-xin&#xff1a;ruyuanhadeng获得600页原创精品文章汇总PDF 目录 1、面试真题2、面试官心理分析3、面试题剖析 1、面试真题 MySQ索引的原理和数据结构能介绍一下吗&#xff1f;b树和b-树有什么区别&#xff1f;MySQL聚簇索引和非聚簇索引的区别是什么&#xff1f;他们分别是…

影响网站排名的4个因素,教你提高网站排名的方法

我们优化网站的目的是&#xff0c;使网站的排名靠前&#xff0c;让更多的用户看到并访问网站&#xff0c;达到营销的效果。网站排名靠前&#xff0c;可以提高企业品牌的知名度&#xff0c;对网站是非常有益的。在网络多变的环境下&#xff0c;影响网站排名有哪些因素呢&#xf…

JAVA使用springboot整合佳博标签打印机(三)

在JAVA使用springboot整合佳博标签打印机&#xff08;二&#xff09;的文章中使用的是花生壳进行的内网穿透 花生壳内网穿透会有异常情况,因为使用的是花生壳免费版本的内网穿透,可能会有服务异常的情况出现,免费服务没有保障 优化方案使用NGINX替换花生壳来实现内网穿透 准…

从头开始实现一个留言板-README

前言 仓库地址&#xff1a;da1234cao/RestFulAPIDemo 由于我没做过C服务器的开发&#xff0c;没有这方面的工程经验&#xff0c;所以代码中&#xff0c;大概率有一些我意识不到的问题&#xff0c;欢迎提issue。 PS: 代码使用C实现restful接口&#xff0c;给前端提供数据读取…

如何封装一个实用的上传组件

前言 马上放假了&#xff0c;时间上相对宽裕&#xff0c;对最近做的东西进行一些总结。今天我们来看一个非常实用的组件&#xff0c;上传组件 我们先从组件的定位、组件的应用场景、组件的特性几个方面进行归纳 定位&#xff1a; 对于上传组件&#xff0c;基础的组件功能属…

【C++】-- 继承

目录 继承的概念及定义 继承的概念 继承的定义 定义格式 继承基类成员访问方式的变化 基类和派生类对象赋值转换 子类对象可以赋值给父类对象/指针/引用 派生类对象赋值给基类的对象 派生类对象赋值给基类的指针 派生类对象赋值给基类的引用 继承中的作用域 派生类的默认成员函…

IM开源项目OpenIM部署文档-从准备工作到nginx配置

IM开源项目OpenIM部署文档-从准备工作到nginx配置 2022-11-14 22:27OpenIM 一、准备工作 运行环境 linux系统即可&#xff0c; Ubuntu 7.5.0-3ubuntu1~18.04最优 图片视频文件存储 支持cos/MinIO https/wss协议 1. 需申请域名或者子域名&#xff08;web im端登录注册及im…

C# HTML

一 HTML 超文本标记语言 在HTML当中存在着大量的标签&#xff0c;我们用HTML提供的标签&#xff0c;将要显示在网页中的内容包含起来。就构成了我们的网页。 二 CSS CSS 控制网页内容显示的效果。 HTMLCSS静态网页。 JSJquery 动态效果。 三 开始动手写HTML页面 ① 首先在…

XSS进阶二

目录实验目的预备知识实验环境实验步骤一实例四、换一个角度&#xff0c;阳光依旧实验步骤二实例五、限制了我的左手&#xff0c;我还有右手实验步骤三实例六、大胆去思考&#xff0c;小心去求证实验目的 1.深入理解xss工作原理。 2.怎么去绕过规则实现xss。 3.培养学生的独立…

Spring Cloud(十):Spring Cloud Skywalking

链路追踪组件选型 Zipkin是Twitter开源的调用链分析工具&#xff0c;目前基于springcloud sleuth得到了广泛的使用&#xff0c;特点是轻量&#xff0c;使用部署简单。Pinpoint是韩国人开源的基于字节码注入的调用链分析&#xff0c;以及应用监控分析工具。特点是支持多种插件&…

XCTF-web Robots

场景一&#xff1a;Training-WWW-Robots 进入场景&#xff0c;提示关于robots.txt文件 访问robots.txt文件&#xff0c;目录下存在 /fl0g.php 文件&#xff0c;进一步访问得到flag 场景二&#xff1a;robots 根据题目&#xff0c;提示关于robots.txt协议 访问成功&#xff…

api股票数据接口能实现什么功能?

api股票数据接口在量化投资方面能够受到比较多交易者的开发和使用的&#xff0c;主要是得于股票量化交易数据接口的7个策略十档行情&#xff0c;可以实现一键解决炒股难题&#xff0c;和多指标辅助追踪主力&#xff0c;跟主力做强势股&#xff0c;只有在行股票数据接口一键就可…

零样本图像分类综述

零样本图像分类综述 摘要 零样本图像分类指训练集和测试集在数据的类别上没有交集的情况下进行图像分类&#xff0c;该技术是解决类别标签缺失问题的一种有效手段&#xff0c;因此受到了日益广泛的关注&#xff0c;自提出问题至今。零样本图像分类研究已经大致有十年时间啦。…

学完 Fluent 官方基础教程,你离一名合格Fluent 流体工程师还有多远?

作者 | 张杨 仿真秀专栏作者 Fluent软件的学习包含基础部分和进阶部分&#xff0c;通常我们学习Fluent软件&#xff0c;都是从一个最简单的三通管开始的。 图1 Fluent的标准初学案例——三通管混合换热 ANSYS Fluent官方的基础培训课程表&#xff0c;通常只包括以下几个方面…