【20】Asio官方文档 PDF 电子书
基本Asio解剖Asio在I/O对象例如sockets上完成操作,即可是同步操作也可是异步操作。在开始使用Asio以前,了解Asio多个部分,你的程序,以及他们怎么一起工作的的概念图非常有用的。
我们考虑当你在一个socket上执行一个连接操作时都发生了些什么作为一个引导的例子。我们可以通过考察同步操作开始。
https://pic002.cnblogs.com/images/2012/438062/2012081822495217.png
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,没有异常会被抛出。
当使用异步操作时,不同的事件序列发生。
https://pic002.cnblogs.com/images/2012/438062/2012081823271121.png
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_service给operating system(操作系统)发信号,告诉它应该开始一个异步连接。
时间流逝。(在同步的情形中这里会等待整个连接操作的时间。)
https://pic002.cnblogs.com/images/2012/438062/2012081823395797.png
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来执行其他异步操作。
下载地址(回复可见):
**** Hidden Message *****
Boost程序库开发的94个秘笈 P 好书,谢谢分享 6666666666 3rog Boost程序库开发的94个秘笈 PBoost程序库开发的94个秘笈 P 6666666666 1111111111111111111
页:
[1]