Boost::Asio入门剖析

Boost::Asio可以在socket等I/O对象上执行同步或异步操作,使用Boost::Asio前很有必要了解Boost::Asio、你的程序以及它们交互的过程。

作为一个引导的例子,我们思考一个当一个socket执行连接操作时发生了什么,我们首先开始一个同步的例子

你的程序需要一个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);

执行一个同步的连接操作时,会顺序发生下列事件

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可能同特定的值进行比较,或者作为一个boolen(false结果意味着没有错误发生),结果被传送会I/O对象。

6.如果操作失败I/O对象抛出一个异常boost::system::error_code,如果启动操作被替换成下面的写法

boost::system::error_code ec;

socket.connect(server_endpoint, ec);

那么操作结果被写入error_code类型变量ec,而没有任何异常返回

当一个异步操作被执行,另一种不同的事件序列

1.你的程序通过调用I/O对象来启动连接操作

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提取结果

5.你的程序通过调用io_service::run()(获取另外一些类似的io_service成员函数)来获取操作结果,如果有未完成的异步操作io_service::run()将阻塞,你必须在启动你的异步操作后周期性的调用它。

6.在io_service::run()内部,io_service把操作结果出列,并传送给your_completion_handler

这就是Boost::Asio工作的简要流程,如果你想要了解进阶功能,比如把Boost::Asio扩展到其他类型的异步操作,你需要更深入的去理解。

时间: 2024-10-25 21:06:19

Boost::Asio入门剖析的相关文章

Boost.Asio入门(CSDN也有Markdown了,好开森)

Boost.Asio入门 首先,让我们先来了解一下什么是 Boost.Asio?怎么编译它?了解的过程中我们会给出一些例子.然后在发现 Boost.Asio 不仅仅是一个网络库的同时你也会接触到 Boost.Asio 中最核心的类--io_service. 什么是Boost.Asio 简单来说,Boost.Asio是一个跨平台的.主要用于网络和其他一些底层输入/输出编程的 C++ 库. 网络 API 的设计方式有很多种,但是 Boost.Asio 的的方式远远优于其它的设计方式.它在 2005

Boost.Asio c++ 网络编程翻译(3)

Boost.Asio入门 什么是Boost.Asio 简单来说,Boost.Asio是一个跨平台的.主要用于网络和其他一些底层输入/输出编程的C++库. 计算机网络的设计方式有很多种,但是Boost.Asio的的方式远远优于它们.它在2005年就被包含进Boost,然后被广大Bosot的用户测试并在很多项目中使用,比如Remobo(http://www.remobo.com),可以让你创建你自己的即时私有网络(IPN),libtorrent(http://www.rasterbar.com/pr

Boost.Asio c++ 网络编程翻译(1)

第一次翻译,希望大家多多指正 实战出精华 Boost.Asio C++ 网络编程 用具体的C++网络编程例子来提升你的技能 John Torjan 用具体的C++网络编程例子来提升你的技能 Copyright ? 2013 Packt Publishing 版权所有,除了在鉴定文章或者评论中进行简单引用,如果没有经过出版者事先的书面授权,该书的任何部分都不能被转载.存储在检索系统中.或者以任何形式和方式传阅. 在这本书准备发行之前,我们已经尽我们最大的努力去保证书中信息的准确性.但是,这本书中包

boost.asio源码剖析(三) ---- 流程分析

* 常见流程分析之一(Tcp异步连接) 我们用一个简单的demo分析Tcp异步连接的流程: 1 #include <iostream> 2 #include <boost/asio.hpp> 3 4 // 异步连接回调函数 5 void on_connect(boost::system::error_code ec) 6 { 7 if (ec) // 连接失败, 输出错误码 8 std::cout << "async connect error:"

boost.asio源码剖析(五) ---- 泛型与面向对象的完美结合

有人说C++是带类的C:有人说C++是面向对象编程语言:有人说C++是面向过程与面向对象结合的语言.类似的评论网上有很多,虽然正确,却片面,是断章取义之言. C++是实践的产物,C++并没有为了成为某某类型的语言而设计,而是一切以工程实践为目的,一切以提升语言能力为目的. 1983年C++诞生之时,由于兼容C语言而天生拥有了面向过程编程的能力:       1989年推出的2.0版,C++完善了对面向对象编程范式的支持:       1993年的3.0版,C++中引入了模板(template),

boost.asio源码剖析(一) ---- 前 言

* 前言 源码之前,了无秘密.                                                       ——侯捷 Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,是不折不扣的“准”标准库. boost.asio是Boost库中非常著名的I/O组件,是用于网络和低层IO编程的跨平台C++库,为开发

boost.asio源码剖析(二) ---- 架构浅析

* 架构浅析 先来看一下asio的0层的组件图.                     (图1.0) io_object是I/O对象的集合,其中包含大家所熟悉的socket.deadline_timer等对象,主要功能是提供接口给用户使用. services服务是逻辑功能的实现者,其中包含提供定时功能的deadline_timer_service.提供socket相关功能的win_iocp_socket_service(windows平台)/reactive_socket_service(其他

boost.asio源码剖析

一. 前 言二. 架构浅析三. 流程分析     * 常见流程分析之一(Tcp异步连接)      * 常见流程分析之二(Tcp异步接受连接)      * 常见流程分析之三(Tcp异步读写数据)      * 常见流程分析之四(Tcp强制关闭连接)      * 常见流程分析之五(Tcp优雅地关闭连接)四. asio中的泛型concepts      * Protocol      * InternetProtocol      * ConstBuffer, ConstBufferSequen

boost.asio源码剖析(四) ---- asio中的泛型概念(concepts)

* Protocol(通信协议) Protocol,是asio在网络编程方面最重要的一个concept.在第一章中的levelX类图中可以看到,所有提供网络相关功能的服务和I/O对象都需要Protocol来确定一些细节. Protocol的约束摘要如下: 1 class protocol 2 { 3 public: 4 /// Obtain an identifier for the type of the protocol. 5 int type() const; 6 7 /// Obtain