Asychronous IO ,提供一套完成同步或异步的框架,对上层封装了与操作系统底层的交互。
使用asio时,需要至少有一个 io_service 对象,io_service类提供了和底层进行IO的功能通道,使用时,做一个声明即可:
boost::asio::io_service io;
为了执行IO操作,还需要一个IO对象,例如一个TCP套接字: boost::asio::ip::tcp::socket .
如下图,同步IO的通用流程:
(1)程序通过asio的I/O对象启动连接操作:socket.connect(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异常。
如下图,异步IO的通用流程图:
(1)程序通过I/O对象启动连接操作:socket.async_connect(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()(或类似函数)以取得操作结果;
io_service对象未停止(stopped()返回false)且还有未完成的操作时,run()会一直阻塞,否则直接返回。(如果希望不阻塞,可以试用io service的其他接口而非run)
asio保证了回调函数只会被run()所在线程调用。因此,若没有run(),回调函数永远不会被调用。
(6)在run()中io_service将操作结果取出队列并翻译成error_code,然后传递给your_completion_handler,并调用该回调函数。
![](https://i-blog.csdnimg.cn/blog_migrate/4ecdc5fe97f5a0da5c59fadf20d48ae3.png)