当前位置: 首页 > news >正文

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

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

相关文章:

  • 离散数学答疑 6
  • 為什麼使用代理API?
  • 数组中的map方法
  • Qt-5.15.0 离线文档 html
  • Vue2+Vue3知识补充
  • Python爬取城市空气质量数据
  • CMake的学习之路
  • nmap工具使用
  • 如何成为嵌入式系统工程师?
  • 解决生产问题的万能接口(Java编译器API的使用)
  • OA协同办公系统 iWebPDF插件安装
  • 字符串循环遍历抵消、队列的应用-649. Dota2 参议院
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • 「C系列」C enum(枚举)
  • go-zero整合Excelize并实现Excel导入导出
  • 【comparator, comparable】小总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 2019年如何成为全栈工程师?
  • css布局,左右固定中间自适应实现
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript 一些 DOM 的知识点
  • Java应用性能调优
  • Linux链接文件
  • MD5加密原理解析及OC版原理实现
  • Python实现BT种子转化为磁力链接【实战】
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • sublime配置文件
  • 程序员该如何有效的找工作?
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端自动化解决方案
  • 树莓派 - 使用须知
  • 网络应用优化——时延与带宽
  • 源码安装memcached和php memcache扩展
  • 怎么把视频里的音乐提取出来
  • 转载:[译] 内容加速黑科技趣谈
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #{}和${}的区别是什么 -- java面试
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • (1)Nginx简介和安装教程
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C++17) optional的使用
  • (rabbitmq的高级特性)消息可靠性
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)ssm高校实验室 毕业设计 800008
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)c52学习之旅-点亮LED灯
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (四)React组件、useState、组件样式
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)c++ std::pair 与 std::make
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net Memory Profiler的使用举例