boost.asio

as(async):异步 

同步io: 

 reactor (非阻塞)(需要注册一次,在等待消息时可以干别的事)   阻塞io网络模型

接口:read\accept\connect\write                接口返回时,io完成

异步io:

iocp (多次投递请求,给菜鸟驿站篮子,让菜鸟驿站把篮子和货物一起送过来)

接口上:WSARecv\AcceptEc\ConnectEx\WSASend    接口返回时,io并未完成

工作中的运用,基于抽象的模型解决问题:

两个命名空间:

boost::aiso

提供核心类以及重要函数

io_context(io上下文):相当于reactor中的对象,相当于windows中IOCP对象

iocp:1.创建一个具体的socket  2.创建一个完成端口,socker绑定在完成端口上

boost::aiso  : 如果socket要异步处理io,必须把socket跟io_context进行绑定

reactor   : epoll   检测  就绪                      非阻塞 io : 操作io(事件循环中处理)

重要函数:

封装的: 同步io函数:posix api类似  标准api:connect    accept    read_some    write_some

                异步io函数:  api     async_connect    async_accept    async_read_some                                                    async_write_some

boost::asio::ip             使用这个命名空间操作协议栈

1.ip地址的封装           ip地址:  ip::address

                                    端点:     ip::tcp::endpoint \  ip::udp::endpoint

服务端绑定:IP port          1.ipv4/ipv6   2.tcp/udp           3.给定具体的端口

socket:     ip::tcp::socket       ip::udp::socket

套接字控制:   set_option  设置套接字属性

                        get_option   

                        io_control    在套接字上执行io指令

cmake 来构建boost.asio应用

boost::system

同步io函数:抛异常   获取错误码

connect(socket,boost::system::error_code err)

异步io函数: buffer(篮子)boost::asio::buffer

                       回调函数:

异步读取数据 :准备一个篮子,如果操作系统帮我们把这个数据都出来后 ,并且填充到里面后 ,会回调函数  :没出错的话:会告诉你往这个篮子放了多长的数据  ,出错了的话:error可以告诉我们没有读取到数据的原因    

篮子就是回调函数,在数据传输完成后会自动触发

async_read_some(buffer(data,lenght)),[](boost::system::error_code err,size_t transferedBytes){

};

创建文件后,根目录是CMakeLists.txt 里面的project相当于解决方案的名字.sln

boost都是以头文件来提供库 #include "asio.h"   #include <boost/asio.hpp>

using namespace boost::asio;

using namespace boost::asio::ip;

io_context相当于reactor对象也相当于一个iocp的对象   io_ctx.run()相当于react中的事件循环,相当于iocp当中的不断地阻塞,等待,完成通知

事件循环:先注册一个事件后,会有不断地事件循环,检测io就绪之后再去操作io

iocp中先投递一个请求到iocp中,iocp会去帮我们完成,然后通知 另外一个线程(这个线程就是一个死循环,不断地从iocp这个完成队列当中取出完成事件)

最开始学习网络编程的思路:

server:首先创建一个socket,是一个listensocket,主要目的是用来接受客户端的连接,bind绑定一个具体的地址,listen用于监听,监听完之后既可以用于接受连接

不同的网络模型,这里的流程都是一摸一样的

boost.asio直接封装了一个对象,这个对象就是acceptor,直接用一个对象进行封装了,acceptor本质上而言是一个socket,所有的socket必须要绑定io_context,否则不能在它的基础上展开异步操作

在这个编程的过程中我们需要进行一个封装,直接使用这个acceptor不太好处理,因为我们在这里接下来会有异步操作,接着又要投递异步操作。对于异步操作而言,虽然io操作不是我们自己的,不是在用户态完成的,但是需要投递一次,完成一次,不是像rector网络编程,他是注册一次,未来只要有数据它就通知你。异步编程或者是boost.asio不会这么灵敏,必须要你投递才会去完成你的事情,否则是不会动的,因为要反复投递,直接用这个对象封装是不太好的。直接去封装一个server,作用是不断接受客户端的连接

//智能指针
include <memory>//因为要反复进行投递,所以我们要封装一个对象class Session:public std::enable_sharder_from_this<Session >
{
public::Session(tcp::socket sock) socket_move(sock))//链接不能拷贝复制,把socket里面的系统资源移动到这个Session里面的socket上面,移动完后,这个sock就会被析构{}
哪些操作:void Start(){
//开始读数据
do_read();
private:void do_close(){boost::system::error_code err;
socket_.close(err);
}  }void do_read(){auto self(shared_from_this())
//不断地异步的去读数据
socket_async_read_some(buffer(readBuffer_,max_packet_len),//后面是具体的回调函数[this,self](boost::system::error_code err,size_t transfered){if(err){do close;return;} //希望回调函数调用时,这个socket_依然存在,则使用智能指针do_read();});void do_write(){auto self(shared_from_this())socket_async_read_some(buffer(readBuffer_,max_packet_len),[this,self](boost::system::error_code,size_t transfered)
{if(err){
do_close();
return ;
}
do_read();
}
}}
}
private:tcp::socket socket_;enum  readBuffer_{max_packet_len=1024};};//不断接收客户端的连接
class Server{
public:server(io_context,short port) :acceptor_(io_ctx,tcp::endpoint(tcp::v4(),port))
{//这当中应该要不断地投递出异步请求
}
private:void do_accept(){acceptor_.async.accept([this](boost::system::error_code err,tcp::socket sock){//在这里进行判断是否出现错误,如果没有出现错误,我们就接受了一条新的连接,那我们就需要构建连接,继续进行封装,本来直接在这个sock上抛出异步读数据的请求,进行网络编程,当我们接收到一个客户端的连接之后,要循环往复在这个连接上读数据写数据,一直到这条连接断开为止,所以要基于这个sock反复地去投递不同地读请求或者是写请求 ,所以給这个sock也封装一个对象if(!err)
{std::make_shared<Session>(sock)->Start();
}})
//第一个参数是一个具体的回调函数,直接给一个回调函数就行了
//第二个参数接受具体的连接,它会直接帮我们构建一个socket
}
//构造函数,server中只有一个变量acceptor_,所以需要
//把io_context传进去,否则构造不会成功,在acceptor上抛异步请求,
//必须要有一个io_context,这个iocontext是我们这个boost.asio命名空间中帮我们构建的
//作为服务端还需要绑定一个端口port
private:tcp::acceptor acceptor_;//不断地抛接收连接的请求};

网络模型可分为以下两大类:

  1. 阻塞/同步模型

    • 线程阻塞等待IO操作完成

    • 典型代表:传统阻塞IO模型

    • 问题:线程资源消耗大,扩展性差

  2. 非阻塞/异步模型

    • Reactor模式:同步非阻塞+事件驱动

    • Proactor模式:异步IO+事件驱动

    • 特点:高并发、资源利用率高

 Boost.Asio

  • 设计特点

    • 跨平台抽象(Windows用IOCP,Linux用epoll)

    • Proactor模式接口,Reactor模式实现(Linux)

    • 支持协程(C++20后)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库后续

-- 添加作者字段 alter table t_hero add author varchar(100); -- 更新数据 update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id 3; upd…

计算机网络基础:网络流量工程与优化策略

计算机网络基础:网络流量工程与优化策略 一、前言二、网络流量工程基础2.1 网络流量工程的定义与目标2.2 网络流量的测量与分析2.2.1 常用的流量测量方法2.2.2 流量数据分析三、网络流量工程的优化策略3.1 链路负载均衡策略3.1.1 基于目的地址的负载均衡3.1.2 基于流量权重的负…

H5DS编辑器教程——H5页面触发动画实战指南

在 H5 页面设计中&#xff0c;触发动画通过动态交互提升用户体验&#xff0c;成为吸引注意力的关键手段。H5DS 编辑器作为一款高效的可视化工具&#xff0c;提供了丰富的动画制作功能&#xff0c;即使是零基础用户也能轻松实现专业级效果。 使用工具&#xff1a;H5DS编辑器 触…

什么是具身智能

具身智能&#xff08;Embodied Intelligence&#xff09;是人工智能与机器人学交叉的前沿领域&#xff0c;强调智能体通过身体与环境的动态交互实现自主学习和进化&#xff0c;其核心在于将感知、行动与认知深度融合‌。通俗地讲&#xff0c;就是机器人或者智能系统在物理环境中…

Java实现pdf中动态插入图片

今天接到一个需求&#xff0c;需要在pdf中的签名处&#xff0c;插入签名照片&#xff0c;但签名位置不固定&#xff0c;话不多说上代码&#xff1a; 1、首先引入itextpdf依赖包&#xff1a; <dependency><groupId>com.itextpdf</groupId><artifactId>…

MySQL8.4 InnoDB Cluster高可用集群使用指南

简介 高可用方案 Orchestrator&#xff1a; 可视化 Web 界面管理 MySQL 拓扑结构&#xff0c;并且兼容多种复制架构&#xff08;异步、半同步、GTID&#xff09;&#xff0c;提供自动和手动的故障转移。但是8.0.21后 MySQL 更新了主从复制相关命令&#xff0c;Orchestrator无…

从泛读到精读:合合信息文档解析如何让大模型更懂复杂文档

从泛读到精读&#xff1a;合合信息文档解析如何让大模型更懂复杂文档 一、引言&#xff1a;破解文档“理解力”瓶颈二、核心功能&#xff1a;合合信息的“破局”亮点功能亮点1&#xff1a;复杂图表的高精度解析图表解析&#xff1a;为大模型装上精准“标尺”表格数据精准还原 功…

git:远程仓库拉取到本地,fork到本地,修改后再上传

讲述仓库成员拉取远程仓库&#xff08;即组长的仓库&#xff0c;里面有成员&#xff09;到本地&#xff0c;修改内容再上传的详细步骤&#xff1a; 1.进入仓库&#xff0c;首先fork &#xff08;如不&#xff0c;所作操作会直接对远程仓库进行&#xff0c;不用管理员审核&…

windows清除电脑开机密码,可保留原本的系统和资料,不重装系统

前言 很久的一台电脑没有使用了&#xff0c;开机密码忘了&#xff0c;进不去系统 方法 1.将一个闲置u盘设置成pe盘&#xff08;注意&#xff0c;这个操作会清空原来u盘的数据&#xff0c;需要在配置前将重要数据转移走&#xff0c;数据无价&#xff0c;别因为配置这个丢了重…

频谱分析仪的最大保持功能

专门应用于例如遥控器之类的&#xff0c;按一下&#xff0c;一瞬间出现的信号的测量。 把仪器连接天线&#xff0c;观测空间中的一些信号&#xff0c;比如WIFI的信号&#xff0c;我们可以看到仪器接收到的信号其实是一直变化的&#xff0c;并不是每一次扫描都能扫到我们想要的这…

智能粉尘监测解决方案|守护工业安全,杜绝爆炸隐患

在厂房轰鸣的生产线上&#xff0c;一粒微小粉尘的聚集可能成为一场灾难的导火索。如何实现粉尘浓度的精准监控与快速响应&#xff1f;我们为您打造了一套"感知-预警-处置"全闭环的智能安全方案&#xff01; 行业痛点&#xff1a;粉尘管理的生死线 在金属加工、化工…

Excel处理控件Aspose.Cells指南:如何在不使用 Microsoft Excel 的情况下解锁 Excel 工作表

Microsoft Excel 允许用户使用密码保护工作表&#xff0c;以防止未经授权的更改。但是&#xff0c;在某些情况下&#xff0c;您可能需要在不使用 Microsoft Excel 的情况下解锁 Excel 工作表。在本指南中&#xff0c;我们将探讨解锁 Excel 工作表的不同方法&#xff0c;例如使用…

音乐webpack(通杀webpack-1)

本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可…

【stm32--HAL库DMA+USART+空闲中断不定长收发数据】

串口通信-Hal库实现不定长度收发&#xff0c;DMAUSART DMA串口STM32CUBEMX配置&#xff08;工程创建&#xff09;基础配置时钟配置工程配置 代码编写现象 DMA 在正式配置之前&#xff0c;我们先来一起简单了解一下DMA。DMA&#xff08;Direct Memory Access&#xff0c;直接内…

爬虫的第三天——爬动态网页

一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点&#xff1a; 用户交互&#xff1a;动态网页能够根据用户的请求而生成不同的内容。内容动态生成&#xff1a;数据来自数据库、API或用户输入。客户端动态渲染&#xff1a;浏览器…

【MATLAB例程】三维环境,基于TOA的动态轨迹定位,轨迹使用UKF(无迹卡尔曼滤波)进行滤波,模拟TOA/IMU的数据融合

本代码实现了一个基于到达时间&#xff08;TOA&#xff09;测距的三维定位系统&#xff0c;结合无迹卡尔曼滤波&#xff08;UKF&#xff09;对移动目标的轨迹进行优化。代码通过多锚节点&#xff08;>3&#xff09;的TOA测量数据&#xff0c;先进行初步定位解算&#xff0c;…

旋转变换原理

旋转变换原理 旋转是仿射变换的一种&#xff0c;通过变换矩阵实现图像绕指定中心旋转&#xff0c;保持直线和平行性不变。其数学表示为&#xff1a; 其中&#xff1a; ( c x , c y ) (c_x, c_y) (cx​,cy​) 是旋转中心。 θ \theta θ 是旋转角度&#xff08;逆时针为正&…

【计算机网络】DHCP工作原理

DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 &#xff08;1&#xff09;DHCP DISCOVER客户机请求 IP 地址&#xff1a; 当一个 DHCP 客户机启动时&#xff0c;客户机还没有 IP 地址&#xff0c;所以客户机要通过 DHC…

应用于汽车车灯电路中的电感产品选型及质量管控标准

随着汽车的智能化与电动化发展&#xff0c;汽车车灯系统逐渐从单一照明功能向集成化、智能化和高能效方向演进。汽车车灯的性能关系着行车安全和驾驶体验&#xff0c;而车规级电感器作为车灯驱动电源电路中的核心元件&#xff0c;其性能直接决定了汽车车灯的效率、可靠性及环境…

MinGW下编译ffmpeg源码时生成compile_commands.json

在前面的博文MinGW下编译nginx源码中&#xff0c;有介绍到使用compiledb工具在MinGW环境中生成compile_commands.json&#xff0c;以为compiledb是捕获的make时的输出&#xff0c;而nginx生成时控制台是有输出编译时的命令行信息的&#xff0c;笔者之前编译过ffmpeg的源码&…