Chinaunix首页 | 论坛 | 博客
  • 博客访问: 910851
  • 博文数量: 299
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-21 10:07
个人简介

Linux后台服务器编程。

文章分类

全部博文(299)

文章存档

2015年(2)

2014年(297)

分类: C/C++

2014-11-11 22:16:05

l  下面我们就详细的分析一下BOOST::ASIO。首先我们从宏观使用的角度来考察ASIO。作为开始首先从同步IO方式开始我们的剖析之旅。

1: BOOST ASIO 下的同步IO操作。

由于asio库具有在不同平台,不同编译器下工作的特性。其对不同平台和编译器的适应是其一大特色且其具有类似于ACE跨平台的特性,相比起ACE的复杂庞大,ASIO则相对较为简单。

1.1:基本概念:

同步方式下的事件发生顺序以如下的方式进行。[以socket方式为例]。


1) 首先,为了能够使用操作系统所提供的服务,程序中至少存在着一个io_service对象,其主要的目的是为将OS所提供的IO服务能够提供给其上层用户IO对象,比如:网络套接字,串口等。我们可以使用 boost::asio::io_service io_service; 声明和定义一个io_service对象。

 2) 将要使用的IO对象与一个io_service对象进行绑定,以便该IO对象能够通过io_service与操作系统底层进行通信。 我们以SOCKET通信为例,通过下面的代码将IO对象与IO_SERVICE对象进行绑定:

tcp::socket socket(io_service);

 

3) io_service调用操作系统的服务进行连接。

 4) 操作系统将其执行的结果返回给io_service对象。

 5) io_service将操作系统返回的错误信息进行相应的转换,将操作系统级的错误代码转换成boost::system::error_code形式。然后,将该错误信息发送至io对象,此处为socket对象。

 6) IO对象将该错误信息向上传递至应用程序。

2:BOOST ASIO 下的异步IO操作。

2.1:而对于异步方式则与同步方式有所不同,其主要区别如下,其相应执行的流程也有所不同。:

1)  首先由一个IO对象,例如:socket,发起一个联接操作。例如:

              socket.async_connect(server_endpoint,your_completion_handler);

其中your_completion_handler为函数指针,其执行联接事件完成后所要执行的服务。

2) IO 对象将其请求信息转发至io_service。

3)  io_service将通知操作系统,开始一个异步联接请求。

4)  操作系统将联接完成的消息进入完成消息队列,io_service读取完成的消息由消息队列中的事件消息。

5)  上层应用必须通过调用io_service.run()函数或其类似的成员函数来获取操作结果。在异步操作未完成时,io_service.run()函数将一直处于阻塞状态。因此,通常是在开始执行异步操作的时候就调用run函数。

6)  在io_service.run ()函数内部,io_service取出操作结果并将错误代码发送转换成可识别的类型,而后将错误代码转发至your_completion_handler函数中,供用户进行相关的错误处理。


后续代码剖析地址如下:
http://blog.csdn.net/mixtrue/article/details/7226399
阅读(2366) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~