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

news2024/11/8 14:22:15

增加发送节点

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

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

增加发送队列

前边实现的是一个简单的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

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

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

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

相关文章

苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?

2024年6月5日,苹果WWDC 2024全球开发者大会如约而至,带来了众多令人兴奋的新功能和新产品。其中,AI 技术的全面融入无疑是最引人注目的亮点。从 iOS、iPadOS 到 macOS,再到 Siri 和开发者工具,苹果正在将 AI 融入到其生…

数字孪生技术推动希腊水务系统的技术进步

OpenFlows 提供的数字孪生技术将科扎尼供水渗漏的响应时间缩短了 50% 引领希腊供水管理改革 新冠疫情之后,希腊制定国家经济复苏计划,旨在推动能源改革、数字化和现代化,作为计划的一部分,希腊正试图实现可持续的给排水管理&…

Qt | openSSL将TCP数据进行不对称(RSA)加密传输-windows平台实操(可行)

01、windows平台工具准备 QtQt5.14.2openSSL下载(选择适合自己的版本即可)https://slproweb.com/products/Win32OpenSSL.htmlTCP调试助手调试助手02、简介 首先简单介绍一下openssl。接着描述如何在windo

龙芯+RT-Thread+LVGL实战笔记(36)——密码锁完善

【写在前面】不知不觉中,又临近学期末了。这个学期,因为一些特殊原因,一直没怎么更新本教程,而且不得已上调了本教程的价格,在此笔者深表歉意。另一方面,自己带的学生发挥不佳,很遗憾未能闯进国赛,为此笔者也郁闷了相当长一段时间。事已至此,也只能慢慢释然,来年再战…

AI网络爬虫:批量爬取AI导航网站Futurepedia数据

Futurepedia致力于使AI技术对各行各业的专业人士更加可理解和实用,提供全面的AI网站和工具目录、易于遵循的指南、每周新闻通讯和信息丰富的YouTube频道,简化AI在专业实践中的整合。如何把Futurepedia上的全部AI网站数据爬取下来呢? 网站一页…

[大模型]LLaMA3-8B-Instruct langchain 接入

环境准备 在 Autodl 平台中租赁一个 3090 等 24G 显存的显卡机器,如下图所示镜像选择 PyTorch-->2.1.0-->3.10(ubuntu22.04)-->12.1 接下来打开刚刚租用服务器的 JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行演示。 pip 换…

一款优秀的下载和共享工具

一、简介 1、它以舒适和快速的方式下载Internet文件,同时支持断点续传和嗅探视频音频的功能。 它具有站点抓取、批量下载队列和计划任务下载等功能,可以接管所有浏览器的下载任务,包括Edge,Firefox和Chrome等主流浏览器。 对于用…

MAC认证

简介 MAC认证是一种基于接口和MAC地址对用户的网络访问权限进行控制的认证方法,它不需要用户安装任何客户端软件。设备在启动了MAC认证的接口上首次检测到用户的MAC地址以后,即启动对该用户的认证操作。认证过程中,不需要用户手动输入用户名…

基于构件开发模型-系统架构师(八)

1、把应用程序中应用最频繁的那部分核心程序作为评价计算机性能的标准程序,称为()程序。 A仿真测试 B核心测试 C基准测试 D标准测试 解析: 系统测试最核心的部分内容,基准测试。 2、运用信息技术进行知识的挖掘和…

修改注册表默认端口号;telnet端口号失败、不通、没反应;访问另一机器端口不通

背景:在多集群项目中,发现访问其他机器不通。遂使用telnet命令试试,确实端口不通。也查看了防火墙策略等,最后尝试了修改注册表默认端口号。这样端口可通了。但并未实际解决问题,在实际项目中需要确认一下你实际项目中…

使用 FormCreate 快速创建仿真页面

在现代前端开发中,快速创建和迭代仿真页面是提高开发效率和用户体验的关键。FormCreate 是一个强大的工具,它通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单组件,支持多种 UI 框架。本文将介绍如何使用 FormCreate 快速创建一个…

C++初阶学习第六弹——探索STL奥秘(一)——标准库中的string类

前言: 在前面,我们学习了C的类与对象,认识到了C与C语言的一些不同,今天,我们将进入C的 关键部分——STL,学习完这部分之后,我们就可以清楚的认识到C相比于C语言的快捷与便利 目录 一、为什么有s…

Docker笔记-Debian容器内搭建ssh服务

登陆容器之后修改密码: passwd 密码设置完成后安装openssh-server apt-get install openssh-server 修改端口号为50022并添加配置 vim /etc/ssh/sshd_config 修改成 Port 50022 PasswordAuthentication yes PermitRootLogin yes 启动 rootlinux:~# /etc/in…

C#完整服务器

控件&#xff1a;三个按钮&#xff0c;输入框&#xff0c;文件框(richTextBox) 打开服务器按钮方法 Socket socket;// 服务器对象Dictionary<string,Socket> dic new Dictionary<string,Socket>();// 存储客户端对象// 打开服务器private void button1_Click(obje…

优思学院|用ChatGPT快速完成数据分析图表【柏累托图法】

数据分析是很多行业的人不可少的一部分&#xff0c;尤其是质量工程师更是日常的工作。然而&#xff0c;随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;将逐渐承担起数据计算的工作&#xff0c;这意味着未来的质量工程师需要具备的不仅仅是计算能力&#xff0c;…

小目标检测篇 | YOLOv8改进之空间上下文感知模块SCAM + 超轻量高效动态上采样DySample

前言:Hello大家好,我是小哥谈。小目标检测是计算机视觉领域中的一个研究方向,旨在从图像或视频中准确地检测和定位尺寸较小的目标物体。相比于常规目标检测任务,小目标检测更具挑战性,因为小目标通常具有低分辨率、低对比度和模糊等特点,容易被背景干扰或遮挡。本篇文章就…

LLM基础介绍

文章目录 一、语言模型1、概念2、预训练语言模型3、NLP4、benchmark1&#xff09;概念2&#xff09;GLUE 5、TPU6、语料 二、神经网络1、概念2、训练神经网络3、案例&#xff1a;word2vec3、RNN&#xff08;循环神经网络&#xff09;4、GRU5、LSTM&#xff08;长短时记忆网络&a…

探索GPT-4V在学术领域的应用——无需编程即可阅读和理解科学论文

1. 概述 论文地址&#xff1a;https://arxiv.org/pdf/2312.05468.pdf 随着人工智能潜力的不断扩大&#xff0c;人工智能&#xff08;AI&#xff09;在化学领域的应用也在迅速发展。特别是大规模语言模型的出现&#xff0c;极大地扩展了人工智能在化学研究中的作用。由于这些模…

随笔——预处理详解

目录 前言预定义符号#define#define定义常量#define定义宏 带有副作用的宏参数宏替换的规则宏和函数的对比#和###运算符##运算符 命名约定#undef命令行定义条件编译头文件的包含包含方式嵌套包含 其他预处理指令完 前言 之前我们在《随笔——编译与链接》中对预处理作了大致的…

BitSet位图进行去重海量数据

问题 怎么在40亿个整数中找到唯一重复的数字? 1.Set的不可重复性 if(set.contains(x))System.out.println("重复的数字是"x);else{set.add(x);}但是&#xff0c;contains()方法消耗的时间&#xff0c;消耗的空间很大&#xff0c;毕竟有约40亿的数据&#xff0c;所…