zoukankan      html  css  js  c++  java
  • Boost::Asio入门剖析

    Boost::Asio可以在socket等I/O对象上执行同步或异步操作,使用Boost::Asio前很有必要了解Boost::Asio、你的程序以及它们交互的过程。
    作为一个引导的例子,我们思考一个当一个socket执行连接操作时发生了什么,我们首先开始一个同步的例子
    你的程序需要一个io_service对象,io_service把你的程序和操作系统I/O设备链接起来。
    boost::asio::io_service io_service;
    你的程序需要一个I/O对象来执行I/O操作,比如tcp socket
    boost::asio::ip::tcp::socket socket(io_service);
    执行一个同步的连接操作时,会顺序发生下列事件
    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,一个error_code可能同特定的值进行比较,或者作为一个boolen(false结果意味着没有错误发生),结果被传送会I/O对象。
    6.如果操作失败I/O对象抛出一个异常boost::system::error_code,如果启动操作被替换成下面的写法
    boost::system::error_code ec;
    socket.connect(server_endpoint, ec);
    那么操作结果被写入error_code类型变量ec,而没有任何异常返回
    当一个异步操作被执行,另一种不同的事件序列
    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.操作系统把操作结果放在一个队列中来指示连接启动完成,供io_service提取结果
    5.你的程序通过调用io_service::run()(获取另外一些类似的io_service成员函数)来获取操作结果,如果有未完成的异步操作io_service::run()将阻塞,你必须在启动你的异步操作后周期性的调用它。
    6.在io_service::run()内部,io_service把操作结果出列,并传送给your_completion_handler
    这就是Boost::Asio工作的简要流程,如果你想要了解进阶功能,比如把Boost::Asio扩展到其他类型的异步操作,你需要更深入的去理解。
  • 相关阅读:
    DBUtils温习2
    DBUtils温习1
    C3P0连接池温习1
    JDBC复习2
    JDBC复习1
    Spring的AOP基于AspectJ的注解方式开发3
    Spring的AOP基于AspectJ的注解方式开发2
    Spring的AOP基于AspectJ的注解方式开发1
    高血压认知3
    pandas cookbook
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/5267592.html
Copyright © 2011-2022 走看看