在使用asio之前最好对它的一系列部件有个概念性的认识。
作为一个列子,我们先考虑当你对一个socket做connect操作时发生什么,我们先考虑同步操作。
你的程序将至少有一个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);
当执行同步connect操作时,将发生下列事件:
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可以用来和一个值进行比较,或者用作一个bool值(false意味着没有发生错误)。然后结果又被转发回I/O对象
6、如果操作失败,I/O对象抛出一个boost::system::system_error类型的异常。如果初始化connect是使用的是下面的代码:
boost::system::error_code ec;
socket.connect(server_endpoint, ec);
那么,ec就被设置成操作的返回结果,并且不会抛出异常
当使用异步操作时,下面的一系列事件将会发生:
1、你的程序调用如下代码初始化一个连接操作:
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接受)来指示一个connect操作已被完成。
5、你的程序必须要调用io_service::run()(或者一个类似功能的io_service成员函数)才能获取结果。当有未完成的异步操作时
对io_service::run()的调用会阻塞,所以通常你开始第一个异步操作时就应该立马调用它。
6、在调用io_service::run()时,io_service从操作结果的队列中出队,把该结果转换成error_code,然后将该ec传递给your_completion_handler。
这是一个关于Boost.Asio如何运作的一个概览。你可以阅读文档继续深入。