Linux后台服务器编程。
分类: 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函数中,供用户进行相关的错误处理。