Boost.Asio 初探
简而言之,通过利用Boost.Asio,I/O对象可以执行异步/同步的操作。在使用Asio之前,先介绍Asio的工作原理。分为两种情况,同步和异步。
同步
同步情况下,当socket执行一个连接(connect)操作时,工作原理如下图:
如图中所示,你的程序需要一个I/O对象(如socket),一个io_service
对象,io_service
对象可以理解为调度器,其主要作用是将程序和操作系统的I/O服务相连。
// 通过asio库,新建io_service对象
boost::asio::io_service io_service;
// 利用io_service对象构造I/O对象,比如TCP套接字
boost::asio::ip::tcp::socket socket(io_service);
当一个异步连接操作发生时,会有如下事件发生:
1. 调用I/O对象,进行连接操作的初始化
\\ 初始化连接操作,即指出所监听的端口
socket.connect(server_endpoint);
- I/O对象将请求转发给
io_service
对象 io_service
对象调用系统的I/O服务进行连接操作- 操作系统将操作结果返回给
io_service
对象 io_service
将操作结果中的任何错误传入一个boost::system::error_code
类型的对象中去。error_code
可以与特定值进行比较,或者作为布尔值进行判断(比如,false表示没有发生错误)。接着,io_service
将结果转发回I/O对象。- 如果操作失败,则
io_service
将跑出类型为boost::system::system_error
的异常。如果代码如下:
boost::system::error_code ec;
socket.connect(server_endpoint, ec);
则不会有异常抛出,取而代之的是,将error_code
变量的值传入ec中返回。
异步
异步的工作原理与同步不一样,如下图:
事件发生顺序如下:
1. 调用I/O对象,进行连接的初始化
socket.async_conne