Asio 核心概念和功能文档学习

基本Asio解剖

Asio在I/O对象例如sockets上完成操作,即可是同步操作也可是异步操作。在开始使用Asio以前,了解Asio多个部分,你的程序,以及他们怎么一起工作的的概念图非常有用的。

我们考虑当你在一个socket上执行一个连接操作时都发生了些什么作为一个引导的例子。我们可以通过考察同步操作开始。

Your program(你的程序)会至少有一个io_service对象。io_service表示your program(你的程序)到operating system(操作系统)的I/O服务的纽带。 

asio::io_service io_service;

要执行一个I/O操作,your program(你的程序)需要一个I/O对象如一个TCP socket:

asio::ip::tcp::socket socket(io_service);

当一个同步连接操作执行时,下面是事件序列发生:

1.Your program(你的程序)通过调用I/O对象初始化连接操作:

socket.connect(server_endpoint);

2.I/O对象转发请求给io_service

3.io_service调用operating system(操作系统)执行连接操作。

4.operating system(操作系统)返回操作的结果给io_service

5.io_service会将操作的任何错误解释成为一个asio::error_code对象。error_code(错误码)可能被与特定值比较,也可能作为一个布尔值被测试(false意味着没有错误发生)。然后结果返回给I/O对象

6.如果失败I/O对象抛出asio::system_error类型的异常。如果初始化代码像下面这样写:

asio::error_code ec;

socket.connect(server_endpoint, ec);

那么操作的结果会被设置到error_code变量ec,没有异常会被抛出。 

当使用异步操作时,不同的事件序列发生。

1.Your program(你的程序)通过调用I/O对象初始化连接:

socket.async_connect(server_endpoint, your_completion_handler);

这里your_completion_handler是一个函数或函数对象有如下的签名:

void your_completion_handler(const asio::error_code& ec);

需要的准确的签名根据执行的异步操作不同而不同。参考手册表明了每种操作相应的格式。

2.I/O对象转发请求给io_service

3.io_serviceoperating system(操作系统)发信号,告诉它应该开始一个异步连接。

时间流逝。(在同步的情形中这里会等待整个连接操作的时间。)

4.operating system(操作系统)把结果放置在准备被io_service对象拾取的队列中表明连接操作已经完成。

5.Your program(你的程序)必须调用io_service::run()(或者一个类似的io_service成员方法)来获取结果。当有未完成的异步操作时,调用io_service::run()会阻塞,所以你通常尽快调用它一旦开始了第一个异步操作。

6.在io_service::run()内部,io_service将运行结果出列,把它翻译为一个error_code,然后把它传给your completion handler。这只是Asio怎样运行的简化图。如果你的需求更高级,你可能想要深入文档,例如扩展Asio来执行其他异步操作。

posted @ 2012-08-19 00:12  国超  阅读(850)  评论(0编辑  收藏  举报