? Boost ? ? Asio ? ? C++ ?    发布于 2017-12-15   600人围观   0条评论

Boost.Asio 初探

简而言之,通过利用Boost.Asio,I/O对象可以执行异步/同步的操作。在使用Asio之前,先介绍Asio的工作原理。分为两种情况,同步和异步。

同步

同步情况下,当socket执行一个连接(connect)操作时,工作原理如下图:

title

如图中所示,你的程序需要一个I/O对象(如socket),一个io_service对象,io_service对象可以理解为调度器,其主要作用是将程序和操作系统的I/O服务相连。

  1. // 通过asio库,新建io_service对象
  2. boost::asio::io_service io_service;
  3. // 利用io_service对象构造I/O对象,比如TCP套接字
  4. boost::asio::ip::tcp::socket socket(io_service);

当一个异步连接操作发生时,会有如下事件发生:
1. 调用I/O对象,进行连接操作的初始化

  1. \\ 初始化连接操作,即指出所监听的端口
  2. socket.connect(server_endpoint);
  1. I/O对象将请求转发给io_service对象
  2. io_service对象调用系统的I/O服务进行连接操作
  3. 操作系统将操作结果返回给io_service对象
  4. io_service将操作结果中的任何错误传入一个boost::system::error_code类型的对象中去。error_code可以与特定值进行比较,或者作为布尔值进行判断(比如,false表示没有发生错误)。接着,io_service将结果转发回I/O对象。
  5. 如果操作失败,则io_service将跑出类型为boost::system::system_error的异常。如果代码如下:
  1. boost::system::error_code ec;
  2. socket.connect(server_endpoint, ec);

则不会有异常抛出,取而代之的是,将error_code变量的值传入ec中返回。

异步

异步的工作原理与同步不一样,如下图:
title

事件发生顺序如下:
1. 调用I/O对象,进行连接的初始化

  1. socket.async_conne
查看更多