粘包问题、mmap和分片上传

一、粘包问题:

如果一端要把文件发给另一端,要发送两个部分的数据:其一是文件名,用于对端创建文件;另一个部分是文件内容。服务端在接收文件名,实际上并不知道有多长, 所以它会试图把网络缓冲区的所有内容都读取出来,但是send底层基于的协议是TCP协议 ——这是一种流式协议。这样的情况下,服务端没办法区分到底是哪些部分是文件名而哪些 部分是文件内容。完全可能会出现服务端把文件名和文件内容混杂在一起的情况,这种就是 江湖中所谓的"粘包"问题。

定义一个结构体规定TCP发送和接收的实际长度从而确定单个消息的边界。 

typedef struct train_s{
int size;
char buf[1000];
} train_t;

1、文件比较大时使用循环机制:发送方使用一个循环来读取文件内容,每 当读取一定字节的数据之后,将这些数据的大小和内容填充进小火车当中;接收方就不断的 使用recv接收小火车的火车头和车厢,先读取4个字节的火车头,再根据车厢长度接收后续 内容。

2、 服务端往客户端已经关闭的网络socket中写入数据,导致进程收到SIGPIPE信号异常终止。解决方法是给send的最后一个参数加上MSG_NOSIGNAL选项。

3、调用recv的时 候,需要传入一个整型的长度参数,但是遗憾的是,这个长度参数是描述的是最大的长度, 而实际recv的长度可能并没有达到最大的长度——因为TCP是一种流式协议,它只能负责每 个报文可靠有序地发送和接收,但是并不能保证传输到网络缓冲区当中的就是完整的一个小 火车(即数据到达有延迟)。解决方案就是给recv函数设置MSG_WAITALL属性,这样的话, recv在不遇到EOF或者异常关闭的情况就能一定把最大长度数据读取出来。

二、mmap:

采用read和send传输数据时,首先打开一个普通文件,数据会从磁盘通过DMA设备传输到内存,即文件对象当中的内核缓冲区部分,然后调用read 数据会从内核缓冲区拷贝到一个用户态的buf 上面(buf是 read 函数的参数),接下来调用send,就将数据拷贝到了网络发送缓冲区,最终实现了文件传输。

但这里涉及到了大量不必要的拷贝操作。

 使用mmap系统调用直接建立文件和用户态空间buf的映射。可以减少一次拷贝。

下面是使用mmap的例子:

//假设文件本身的内容是hello#include <func.h>
int main(int argc, char *argv[])
{// ./mmap file1ARGS_CHECK(argc, 2);// 先open文件int fd = open(argv[1], O_RDWR);ERROR_CHECK(fd, -1, "open");// 建立内存和磁盘之间的映射char *p = (char *)mmap(NULL, 5, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);ERROR_CHECK(p, MAP_FAILED, "mmap"); // mmap失败返回不是NULLfor (int i = 0; i < 5; ++i){printf("%c", *(p + i));}printf("\n");*(p + 4) = '0';for (int i = 0; i < 10; ++i){printf("%c", *(p + i));}munmap(p, 5);close(fd);return 0;
}

 运行结果:

mmap的底层原理 :

read/write 是让数据在内核态的文件对象和用户态内存之间进行来回拷 贝,文件对象会和一片由操作系统管理的内存区域(被称为页缓存)相关联,一般来说,操作系统会选 择一个合适策略并使用专门的硬件(比如DMA设备)来同步磁盘和页缓存当中的内容,这样 read/write 操 作最终就会影响到磁盘。而 mmap 的处理就更加简单粗暴,它直接把页缓存的一部分映射到用户态内存, 这样用户在用户态当中的操作就直接对应页缓存的操作。 这样看上去的话, mmap 的效率总是会比 read/write 更加高,因为它避免了一次数据在用户态和内核态 之间的拷贝。但是考虑到 read/write 的特殊性质——它们总是顺序地而不是随机地访问磁盘文件的内 容,所以操作系统可以根据这个特点进行优化,比如文件内容的预读等等,最终经过测试—— read/write 在顺序读写的时候性能更好,而 mmap 在随机访问的时候性能更好。

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

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

相关文章

v-for 进行列表的 增删改查

通过对象下标替换属性值 但是通过实践此方法是错误的&#xff0c;Vue监听的是students这个对象&#xff0c;而不是这个对象里面的数组信息&#xff0c;也就是说&#xff0c;改变里面的值&#xff0c;并不能在页面上实现更新的功能 <!DOCTYPE html> <html lang"en…

Adobe国际认证详解-动漫制作专业就业方向和前景

动漫制作专业的就业方向和前景随着创意产业的蓬勃发展而愈发广阔。这一专业涵盖了从角色设计、场景绘制到动画制作、特效合成等多个环节&#xff0c;是创意与技术相结合的典型代表。随着数字媒体和互联网的普及&#xff0c;动漫制作专业人才的需求正不断增长&#xff0c;为该专…

c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作

c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作 文章目录 c primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作16.3.3 对矢量可执行的其他操作…

计算机毕业设计python+neo4j知识图谱中医问答系统 中医中药方剂大数据可视化 vue.js 前后端分离 大数据毕业设计 机器学习 深度学习 人工智能

背景介绍 中医问答系统开题报告 一、项目背景与意义 随着科技的飞速发展和人们生活水平的提高&#xff0c;人们对健康管理的需求日益增强。中医作为中国传统医学的瑰宝&#xff0c;其独特的理论体系、诊疗方法和养生观念在现代社会依然发挥着不可替代的作用。然而&#xff0…

华为云技术精髓笔记(四)-CES基础入门实战

华为云技术精髓笔记(四) CES基础入门实战 一、监控ECS性能 1、 远程登录ECS 步骤一 双击实验桌面的“Xfce终端”打开Terminal&#xff0c;输入以下命令登录云服务器。注意&#xff1a;请使用云服务器的公网IP替换命令中的【EIP】。 LANGen_us.UTF-8 ssh rootEIP说明&#x…

机械学习—零基础学习日志(高数09——函数图形)

零基础为了学人工智能&#xff0c;真的开始复习高数 函数图像&#xff0c;开始新的学习&#xff01; 幂函数 利用函数的性质&#xff0c;以幂函数为例&#xff0c;因为单调性相同&#xff0c;利用图中的2和3公式&#xff0c;求最值问题&#xff0c;可以直接将式子进行简化。这…

东京裸机云多IP服务器全面分析

东京裸机云多IP服务器是一种提供多IP地址分配和高性能网络服务的云计算解决方案&#xff0c;广泛应用于需要多IP管理和高稳定性的网络应用。下面将从几个方面具体介绍东京裸机云多IP服务器&#xff0c;rak部落为您整理发布东京裸机云多IP服务器的全面分析。 在数字化时代&#…

SQL injection UNION attacks SQL注入联合查询攻击

通过使用UNION关键字&#xff0c;拼接新的SQL语句从而获得额外的内容&#xff0c;例如 select a,b FROM table1 UNION select c,d FROM table2&#xff0c;可以一次性查询 2行数据&#xff0c;一行是a&#xff0c;b&#xff0c;一行是c&#xff0c;d。 UNION查询必须满足2个条…

15Kg级无人机降落伞系统技术详解

15Kg级无人机降落伞系统由以下几个主要部分组成&#xff1a; 1. 降落伞主体&#xff1a;采用轻质高强度的材料制成&#xff0c;能够承受无人机在降落过程中产生的冲击力&#xff0c;并确保无人机平稳安全地着陆。 2. 伞绳与连接机构&#xff1a;伞绳负责连接降落伞主体与无人机…

操作系统常用知识总结(基本结构+磁盘+进程)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 基本结构 冯诺依曼计算机模型 现代计算机模型是基于冯诺依曼计算…

适配器模式详解和应用

目录 适配器模式适配器模式结构适配器模式适用场景适配器模式优缺点练手题目题目描述输入描述输出描述题解 适配器模式 适配器模式是一种结构型设计模式&#xff0c; 它能使接口不兼容的对象能够相互合作。 适配器模式结构 对象适配器 实现时使用了构成原则&#xff1a; 适…

重复图片查找:巧用Python和OpenCV进行图像哈希与汉明距离检测以从海量图片中找出重复图片

重复图片查找&#xff1a;巧用Python和OpenCV进行图像哈希与汉明距离检测以从海量图片中找出重复图片 1. 导言2. 环境准备3. 图像哈希&#xff08;pHash&#xff09;原理4. 汉明距离原理5. 代码实现导入必要的库图像哈希计算函数汉明距离计算函数查找重复图片函数示例使用 在处…

C++:内存管理(new,delete)

目录 C/C内存分布 C语言内存管理 C内存管理&#xff1a; new和delete的原理 new delete malloc/free和new/delete的区别 C/C内存分布 在C/C中&#xff0c;都有一块虚拟地址&#xff0c;内部井然有序的将代码分成了几部分&#xff0c;如下表&#xff1a; 栈&#xff1a;…

C++实现LRU缓存(新手入门详解)

LRU的概念 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;是一种常用的缓存淘汰策略&#xff0c;主要目的是在缓存空间有限的情况下&#xff0c;优先淘汰那些最长时间没有被访问的数据项。LRU 策略的核心思想是&#xff1a; 缓存空间有限&#xff1…

深入浅出C语言指针(进阶篇)

深入浅出C语言指针(基础篇) 深入浅出C语言指针(进阶篇) 目录 引言 一、指针和数组 1.数组名的理解 2.指针访问数组 3.一维数组传参的本质 二、二级指针 1.二级指针的概念 2.二级指针的内存表示 3.二级指针的解引用 三、字符指针 1.指针指向单个字符 2.指针指向字…

【目标检测】Anaconda+PyTorch配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch关键步骤安装&#xff0c;为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程&#xff0c;为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网&#xff1a;https://www.anaconda.com/ 另外&#…

Golang | Leetcode Golang题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; func firstBadVersion(n int) int {return sort.Search(n, func(version int) bool { return isBadVersion(version) }) }

Elasticsearch基础(六):使用Kibana Lens进行数据可视化

文章目录 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 二、基础可视化 1、指标可视化 2、垂直堆积条形图 3、表格 三、高级可视化 1、多图层和索引 2、子桶 3、树状图 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 在Kibana主页&#xff0c;单击页面…

vxe-table——实现切换页码时排序状态的回显问题(ant-design+elementUi中table排序不同时回显的bug)——js技能提升

之前写的后台管理系统&#xff0c;都是用的antdelement&#xff0c;table组件中的【排序】问题是有一定的缺陷的。 想要实现的效果&#xff1a; antv——table组件一次只支持一个参数的排序 如下图&#xff1a; 就算是可以自行将排序字段拼接到列表接口的入参中&#xff0c…

Druid【基础 01】是什么+主要特点+设计原则+架构+数据结构(简单入门Druid)

Druid入门 1. 是什么2. 主要特点3. 三个设计原则4. Architecture 架构5. 数据结构5.1 DataSource 结构5.2 Segment 结构 Druid 非中文官网&#xff0c;内容不少且介绍的挺详细的&#xff0c;需要英文阅读能力或者翻译工具进行辅助。 1. 是什么 先看看官网怎么说&#xff1a; A…