Boost库学习4 - 网络库asio

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

简介

  • asio即异步输入输出;
  • 一个跨平台的C++库,可移植;
  • 采用前摄器模式Proactor,支持以同步或异步的方式处理事件,不需要使用多线程和锁,有效避免多线程编程带来的诸多副作用(如竞争,死锁等);
  • asio官方文档

Asio基本工作流程

同步操作

  • 同步模式下,流程一步一步执行,需要上一步操作完成返回再执行下一步;
    在这里插入图片描述
  1. 你的程序Your Program通过调用I/O对象来进行操作;
  2. I/O对象将操作请求发给I/O执行上下文;
  3. I/O执行上下文调用操作系统接口来执行操作;
  4. 操作系统将操作的结果返回给I/O执行上下文;
  5. I/O执行上下文将操作结果转发给I/O对象;
  6. I/O对象将执行结果发送给你的程序;

异步操作

  • 异步模式下,由io_service提交io异步执行,程序不用等待io返回直接执行下一步;
  • 异步执行由io_service的run()函数负责检测io返回并通知预先注册的回调句柄(即回调函数),由回调句柄执行io返回的后续流程;
    在这里插入图片描述在这里插入图片描述
  1. 你的程序Your Program通过调用I/O对象来进行操作;
  2. I/O对象将请求转发给I/O执行上下文;
  3. I/O执行上下文向操作系统发出操作信号,进行异步处理,同时你的程序可以做其他事;
  4. 操作系统将异步处理结果通知到I/O执行上下文;
  5. 你的程序调用io_context::run()(或类似的io_context成员函数)检索结果;当有未完成的异步操作时,调用io_context::run()会阻塞,所以通常会在开始第一个异步操作时调用它;
  6. 在调用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值