简介
- asio即异步输入输出;
- 一个跨平台的C++库,可移植;
- 采用前摄器模式Proactor,支持以同步或异步的方式处理事件,不需要使用多线程和锁,有效避免多线程编程带来的诸多副作用(如竞争,死锁等);
- asio官方文档;
Asio基本工作流程
同步操作
- 同步模式下,流程一步一步执行,需要上一步操作完成返回再执行下一步;

- 你的程序Your Program通过调用I/O对象来进行操作;
- I/O对象将操作请求发给I/O执行上下文;
- I/O执行上下文调用操作系统接口来执行操作;
- 操作系统将操作的结果返回给I/O执行上下文;
- I/O执行上下文将操作结果转发给I/O对象;
- I/O对象将执行结果发送给你的程序;
异步操作
- 异步模式下,由io_service提交io异步执行,程序不用等待io返回直接执行下一步;
- 异步执行由io_service的run()函数负责检测io返回并通知预先注册的回调句柄(即回调函数),由回调句柄执行io返回的后续流程;


- 你的程序Your Program通过调用I/O对象来进行操作;
- I/O对象将请求转发给I/O执行上下文;
- I/O执行上下文向操作系统发出操作信号,进行异步处理,同时你的程序可以做其他事;
- 操作系统将异步处理结果通知到I/O执行上下文;
- 你的程序调用io_context::run()(或类似的io_context成员函数)检索结果;当有未完成的异步操作时,调用io_context::run()会阻塞,所以通常会在开始第一个异步操作时调用它;
- 在调用io_context::run()时,I/O执行上下文会将操作结果从队列中取出,然后将其传递给你的结果处理接口;
前摄器模式Proactor

- 由使用者(Initiator)发起一个异步操作(Asynchronous Operation),同时创建一个异步回调对象(Completion Handler);
- 该异步操作交给了异步操作执行器(Asynchronous Operation Processor),由它负责执行异步操作,并在完成后将一个完成事件插入完成事件队列(Completion Event Queue);
- 前摄器(Proactor)驱动异步事件分派器(Asynchronous Event Demultiplexer)从完成事件队列中获取完成的事件(这是一个阻塞的过程),如果获取到则前摄器找出与该事件关联的回调对象并执行回调,继续后续流程;
使用条件
- asio位于命令空间 boost::asio,使用时需要包含头文件
#include "boost/asio.hpp";
常用类和函数
boost::asio::io_service
- I/O 服务,负责与操作系统交互,等待异步操作的结束并执行回调;
boost::asio::io_service service;
service.post(handler); // 优先将任务排进处理队列然后返回,任务会在某个时机被完成,即handler稍后会在某个调用了service.run()的线程中被调用
service.dispatch(handler); // 即时请求io_service去调用指定的任务
service.wrap(handler); // 当被调用时它会调用service.dispatch(handler)
service.run(); // 监听io事件响应并执行回调

boost::asio::io_context
- io对象,只有调用run方法的线程才会被asio调度去执行任务;
- 可以看作事件循环, socket 、timer都需要它;
boost::asio::io_context::run() // 运行事件循环
boost::asio::ip
- 网络通信部分
ip地址
boost::asio::ip::address(v4_or_v6_address) //把一个v4或者v6的地址转换成ip::address
boost::asio::ip::address:from_string(str) //根据一个IPv4地址(用.隔开的)或者一个IPv6地址(十六进制表示)创建一个地址
boost::asio::ip::address::to_string() // 返回ip地址的字符串。
boost

本文介绍了Asio库的基本概念,包括其工作原理、同步与异步操作流程,以及前摄器模式Proactor的工作机制。深入探讨了Asio库的使用条件、核心类和函数,如io_service、ip模块、socket类等,并提供了详细的示例代码。

1537

被折叠的 条评论
为什么被折叠?



