boost asio异步服务器(3)增加发送队列实现全双工通信

增加发送节点

构造发送节点,管理发送数据。发送节点的类如下。

这个发送节点用于保证发送和接收数据的有效性。

增加发送队列

前边实现的是一个简单的echo服务器,也就是服务器将收到的内容发送给对应的客户端。但是在实际的服务器设计中,服务器是全双工工作的,也就是说,服务器会一直监听客户端的写事件,而在发送的过程中是可以在任意的时刻发送的。也就是说,实现全双工通信,需要对服务器的收发进行分离。

对于异步收发,也就是要实现一个读接口和写接口。但是,对于boost::asio会有一个问题,就是当调用async_read_some或者async_read_write的时候,由于tcp的缓冲区不够,会导致发送或者接收数据的时序错乱。大家可以参考我的这篇博客boost asio异步api(1)_asio 异步http服务端-CSDN博客

因此,我们需要维护一个发送队列,保证发送的时序性。但是,作为服务器的发送队列还需要考虑安全性,就是当多个客户端的线程来访问时的安全性。服务器调用发送接口基本上都是逻辑线程和boost::asio返回的网络线程不是一个线程,所以还应该给发送队列增加一把互斥锁,保证安全性

改造发送接口

这里需要介绍一下std::lock_guard这个类,这是c11的新特性,这里的泛型是std::mutex,send_lock是std::mutex的锁,这里生成的lock会随着作用域的结束,自动解锁。

改造接收接口

完整代码如下

codes-C++: C++学习 - Gitee.com

这里的服务器虽然实现了收发分离,但还是有缺陷,比如粘包问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《精通ChatGPT:从入门到大师的Prompt指南》第7章:创意写作

第7章:创意写作 7.1 角色设定 角色设定是创意写作中最关键的环节之一。成功的角色设定能够让读者对故事产生共鸣,使故事更加生动有趣。角色不仅仅是情节发展的载体,更是读者情感的投射对象。因此,深入了解如何设定一个生动而有深…

讯方技术与华为终端签署鸿蒙合作协议,将为企业助培百万鸿蒙人才

1月18日,鸿蒙生态千帆启航仪式在深圳举行,华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览面向开发者开放申请,这意味着鸿蒙生态进入第二阶段,将加速千行百业的应用鸿蒙化。讯方技术总裁刘国锋、副总经理刘铭皓应邀出席启航仪式&…

Tessy学习系列(四):组件测试——官方例程interior_light

一、新建工程 (1)新建工程 注意:路径不能包含空格与中文 (2)新建测试集 (3)新建组件测试模块 (4)设置测试模块为组件测试模块 二、导入源码 (1&#xff09…

【ARM Cache 及 MMU 系列文章 6.4 -- Cache miss 统计详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 ARM Cache Miss 统计Cache 多层架构简介Cache 未命中的类型Cache 未命中统计Cache miss 统计代码实现Cache Miss 统计意义ARM Cache Miss 统计 在ARMv8/v9架构中,缓存未命中(Cache …

【wiki知识库】06.文档管理接口的实现--SpringBoot后端部分

目录 一、🔥今日目标 二、🎈SpringBoot部分类的添加 1.调用MybatisGenerator 2.添加DocSaveParam 3.添加DocQueryVo 三、🚆后端新增接口 3.1添加DocController 3.1.1 /all/{ebokId} 3.1.2 /doc/save 3.1.3 /doc/delete/{idStr} …

“盒装”床垫在美国全面爆发,沃尔玛电商正革新传统床上用品行业

​​“盒装”床垫在美国市场的全面普及以及沃尔玛电商对传统床上用品行业的创新,正引领着家居市场的变革潮流。这两个趋势不仅改变了消费者的购物方式,也为整个行业带来了新的发展机遇。 盒装床垫的兴起为消费者带来便捷灵活的购物体验。采用先进压缩技术…

网络流常用示意图及基本概念

【网络流简介】 ● 网络流基本概念网络:网络是一个有向有权图,包含一个源点和一个汇点,没有反平行边。网络流:是定义在网络边集上的一个非负函数,表示边上的流量。网络最大流:在满足容量约束和流量守恒的前…

机器学习-支持向量机

目录 一支持向量机 1.支持向量机SVM 2构建svm目标函数 3.拉格朗日乘法,kkt条件 拉格朗日乘法: kkt条件 对偶问题 4.最小化SVM目标函数 kkt条件: 对偶转换: 5软间隔及优化 优化svm目标函数 构造拉格朗日函数 对偶转换关系…

快手可灵AI开始内测,对标Sora?免费体验!

最近,国内第一个可以和 Sora 相媲美的 AI 视频生成模型,快手的可灵大模型(Kling)开始免费内测。 在快手旗下的快影App,就可以申请。 别忘记填写表格信息,可以加快你的申请通过,链接我放在这里…

超详解——Python 序列详解——基础篇

目录 1. 序列的概念 字符串(String) 列表(List) 元组(Tuple) 2. 标准类型操作符 连接操作符() 重复操作符(*) 索引操作符([]) …

Ubuntu18.04 文件管理器无法打开的解决方法

问题:打开Ubuntu虚拟机发现文件管理器无法打开,一直在转圈圈 在终端中输入 nautilus 显示如下信息 nautilus: symbol lookup error: /usr/lib/x86_64-linux-gnu/tracker-2.0/libtracker-data.so.0: undefined symbol: sqlite3_bind_pointer 解决措施&#xff1a…

linux安装anconda后,之前的python环境如何加载到anconda环境中

一、问题描述 由于某种原因,我们需要在系统中安装多个环境,我们自然想到安装anconda来解决这个问题。但是当我们安装好anconda后,发现我们未安装anconda之前的python环境使用不了了。那么我们如何将之前的python环境放到conda 环境中呢。 二…

“CEO在左,IP在右”企业家直播浪潮来了?

“在未来,每个人都可能成名15分钟。” 这句15分钟定律,虽然是美国波普艺术之父安迪沃霍尔在五十年前提出,但把它放在自媒体媒介兴起的当下同样适用。如今世界,成名15分钟足以给任何一个人或平台带来“泼天的富贵”。 而对于电商…

Docker 基础使用(5)Compose

文章目录 Docker Compose 基础认识Docker Compose 基础语法Docker Compose 基础指令Docker Compose 使用实例 Docker 基础使用(0)基础认识 Docker 基础使用(1)使用流程概览 Docker 基础使用(2)镜像与容器 Docker 基础使用(3)存储卷…

2024中国海洋装备展暨航海装备大会(福州海峡国际会展中心)

关于邀请参加2024中国海洋装备博览会的函 为加快推动海洋强国建设。在福建省人民政府的大力支持下,第二届中国海洋装备博览会将于2024年11月15-18日在福州举办。 博览会将进一步聚焦产业链和供应链协同创新,着力推动现代海洋产业体系建设,促进海洋科技…

Git保姆级教程

目录 Git是什么,为什么要学这个工具? 码云注册并创建仓库 Git安装 查看本地仓库状态 添加到暂存区 提交到本地库 修改文件 版本回退 创建、切换和删除分支 合并分支 克隆远端库到本地 将本地库推送到远端库 命令设置别名 Git是什么&#xf…

人工智能在【多模态:多组学+复发转移+肿瘤起源】的最新研究进展|顶刊速递·2024-06-11

小罗碎碎念 本期文献速递的主题是——人工智能多模态/多组学肿瘤的复发转移肿瘤起源。 今天的六篇文章比较特殊,大家要好好留心一下,因为选题是老板亲自下场定的,机会难得。 最近状态不太好,这周还要在北京待几天处理些事情&#…

算法day25

第一题 394. 字符串解码 解法:模拟栈的完成上述的操作; 分析: 下面以如图的字符串来分析; 首先定义一个数字栈用来存放数字,同时定义一个容器stringbuffer栈,里面用来存放字符串; 1、遇到数字&…

【总线】AMBA总线架构的发展历程

目录 引言 发展历程 第一代AMBA(AMBA 1) 第二代AMBA(AMBA 2) 第三代AMBA(AMBA 3) 第四代AMBA(AMBA 4) 第五代AMBA(AMBA 5) AMBA协议简介 ASB&#x…

VRRP多备份组(华为)

#交换设备 VRRP多备份组 当 VRRP 配置为单备份组时,业务全部由 Master 设备承担,而 Backup 设备完全处于空闲状态,没有得到充分利用。VRRP 可以通过配置多备份组来实现负载分担,有效地解决了这一问题。 VRRP 允许同一台设备的…