1、概述: Boost.Asio是一个跨平台的C++库,用于网络和底层I/O编程,可以在I/O对象(如socket)上执行同步和异步操作。

  2、简略的过程分析。以socket的连接操作为例:

  你的程序中需要至少定义一个io_service对象:boost::asio::io_service io_service。io_service表示程序到操作系统I/O服务的“连接”。

  为执行I/O操作,还需要一个I/O对象(通常需要使用io_service构造),如一个TCP套接字:boost::asio::ip::tcp::socket socket(io_service)。

  1)同步的连接过程中,发生以下事件序列(对应下面的左图):

  (1)程序通过I/O对象启动连接操作:socket.connect(server_endpoint);

  (2)I/O对象将请求转发给io_service;

  (3)io_service请求操作系统去执行连接操作;

  (4)操作系统将操作结果返回给io_service;

  (5)io_service将操作的(错误)结果转换成boost::system::error_code对象,并回传给I/O对象;

  (6)如果操作失败,I/O对象抛出boost::system::system_error异常。

  如果是使用以下方式,则只设置错误码,不会抛出异常:

boost::system::error_code ec;
socket.connect(server_endpoint, ec);

  2)异步的连接过程中,发生以下事件序列(对应下面的中图和右图):

  (1)程序通过I/O对象启动连接操作:socket.async_connect(server_endpoint, your_completion_handler);

  your_completion_handler是一个函数(对象),原型:void your_completion_handler(const boost::system::error_code& ec);

  (2)I/O对象将请求转发给io_service;

  (3)io_service发信号给操作系统,告知它去开始一个异步的连接操作;

  一段时间过去... ...注意,在同步的情形下,程序会一直等待连接操作完成,而异步则是先立即返回。

  (4)连接操作完成时,操作系统把结果放在队列中

  (5)程序必须调用io_service::run()(或类似函数)以取得操作结果。一般在你刚启动第一个异步操作时就要调用run();

  io_service对象未停止(stopped()返回false)且还有未完成的操作时,run()会一直阻塞,否则直接返回。

  我的理解(io_service对象未停止时):如果当前有未完成的异步操作且队列为空,则需要等待,因此run()将阻塞(在Linux下借助pstack可知是阻塞于epoll_wait()或pthread_cond_wait()等)。操作系统完成某个异步操作后,把结果放到队列并通知应用程序。run()被“唤醒”,从队列中取出结果并调用相应的回调函数;如果当前没有未完成的异步操作且队列为空,表示所有异步操作已经完成,则run()将直接返回;当然,如果当前队列非空,则run()直接取出结果并调用回调函数。

  asio保证了回调函数只会被run()所在线程调用。因此,若没有run(),回调函数永远不会被调用。

  (6)在run()中io_service将操作结果取出队列并翻译成error_code,然后传递给your_completion_handler

  

  3、例子:

// 一个简单的回显服务器

#include <iostream>
#include <memory>
#include <array>
#include <boost/asio.hpp>using boost::asio::ip::tcp;// 服务器和某个客户端之间的“会话”
// 负责处理读写事件
class session : public std::enable_shared_from_this<session>
{
public:session(tcp::socket s) : socket_(std::move(s)) {}void start(){async_read();}
private:void async_read(){auto self(shared_from_this());socket_.async_read_some(boost::asio::buffer(data_),  // 异步读[this, self](const boost::system::error_code &ec, size_t bytes_transferred)  // 读操作完成时回调该函数{  // 捕获`self`使shared_ptr<session>的引用计数增加1,在该例中避免了async_read()退出时其引用计数变为0if (!ec)async_write(bytes_transferred);  // 读完即写
            });}void async_write(std::size_t length){auto self(shared_from_this());boost::asio::async_write(socket_, boost::asio::buffer(data_, length),  // 异步写[this, self](const boost::system::error_code &ec, size_t){if (!ec)async_read();});}tcp::socket socket_;  // “会话”基于已经建立的socket连接std::array<char, 1024> data_;
};// 服务器类
// 监听客户端连接请求(async_accept)。与某个客户端建立socket连接后,为它创建一个session
class server
{
public:server(boost::asio::io_service &io_service, short port): acceptor_(io_service, tcp::endpoint(tcp::v4(), port)), socket_(io_service){async_accept();}private:void async_accept(){acceptor_.async_accept(socket_, std::bind(&server::handle_accept, this, std::placeholders::_1));  // 异步accept。socket连接建立后,调用handle_accept()
    }void handle_accept(const boost::system::error_code &ec){if (!ec){std::shared_ptr<session> session_ptr(new session(std::move(socket_)));session_ptr->start();}async_accept();  // 继续监听客户端连接请求
    }tcp::acceptor acceptor_;tcp::socket socket_;
};int main(int argc, char* argv[])
{boost::asio::io_service io_service;server s(io_service, 52014);io_service.run();return 0;
}

  参考资料:

  http://www.boost.org/

Boost.Asio使用实例相关推荐

  1. boost::asio中的C/S同步实例源码

    近来狂热地研究boost的开发技术,现将读书笔记整理如下: 需要说明的是, 本博该专题下面关于boost的源码是采用boost1.55版本, 运行在Ubuntu 14.04 64bit下面, 使用ap ...

  2. c++语言 tcp例子,C++ boost::asio编程-同步TCP详解及实例代码

    boost::asio编程-同步TCP boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. boost.asio库支持TCP.UDP.IC ...

  3. boost asio io_service学习笔记

    转自:http://hi.baidu.com/jrckkyy/blog/item/e86835d61e60722506088b6a.html 构造函数 构造函数的主要动作就是调用CreateIoCom ...

  4. Boost asio 定时器

    Boost asio入门学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载.文章中有连接失效或是技术谬误的地方,请与我联系. https://blog.csdn.net/luchengtao ...

  5. boost asio 应用方法学(二)——深入框架

    要用好它,就必须先了解它,而且不能停止于表面,必须深入到内部.而了解一件事物,先要了解它的框架,再了解它的细节.了解了框架,我们就有了提纲挈领的认识. 关于 boost asio 框架结构,在其文档中 ...

  6. boost::asio译文

    boost::asio译文 Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布( ...

  7. Boost.Asio入门

    原文地址:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html Boo ...

  8. Boost.Asio技术文档汇总

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  9. Boost Asio总结(16)例子

    step1. 创建io_server实例(在Boost1.66后的版本为io_context) boost::asio::io_service io_service; step2. 设置endpoin ...

最新文章

  1. dva + antd + mockjs 实现用户管理
  2. C# 在PDF中绘制动态图章
  3. 语音识别数据集处理python进行音频处理
  4. 二阶偏微分方程组 龙格库塔法_有限单元法(Finite Element Method)实现声波方程模拟(Part 2)...
  5. java源码影视源码搭建教程_新版千月影视app源码+搭建教程
  6. Vue基础之Class和Style绑定
  7. Try Git 译文
  8. Python读取文本文件
  9. 启动计算机时页面配置出现问题,开机提示“由于启动计算机时出现了页面配置问题…”...
  10. Deep Learning 博文推荐和学习资料
  11. java并发包原理及使用场景
  12. 作为项目经理如何做好项目进度管理
  13. 详解会员积分营销系统的作用
  14. 如何合理的使用统计图表
  15. 【线性代数(12)】线性方程组、方程组解的结构
  16. 微博 用户画像_面向新浪微博的用户画像研究
  17. python 函数调用问题
  18. websocket 1006错误码
  19. k8s使用命令报错:error: You must be logged in to the server (Unauthorized)
  20. kaggle之员工离职分析

热门文章

  1. python中常见的双下方法_python中常见的双下方法_python面向对象(5)__特殊双下方法...
  2. python写一个服务_写一个Python的windows服务
  3. 高中数学?_JAVA
  4. max7219驱动共阳点阵
  5. 【C++】18.char[] 与 string 的区别 与 互相转化、c_str() 函数用法
  6. 基于Android的百度地图开发
  7. 深入理解java SPI机制
  8. 读阿里许令波老师晋升评审有感
  9. Java集合类ArrayList循环中删除特定元素
  10. 架构师之路16年精选50篇