以前使用ACE实现了一个服务器框架,觉得太过“笨重”,一直努力想将原来的代码升级一下,后来看了一下boost和asio的实现,觉得相对ace很light,下定决心移植到boost/asio上来,这就是bas的由来。
bas的设计思路是基于开源、成熟、稳定、跨平台的网络异步io库的基础上,搭建一个比较傻瓜式、比较健壮、实现主要tcp server服务器功能的框架式平台,用户只需要实现处理具体work的模板参数类即可。
bas为boost_asio_server(baserver)的简称,是采用Half-Sync/Half-Async模式的服务器框架,使用c++实现,能够大大简化tcp server的开发工作。bas目前实现了以下功能:
1、底层基于boost及asio实现,支持ssl,跨越多种操作系统平台;
2、I/O部分使用非阻塞异步处理机制、业务逻辑处理部分采用同步线程池实现,便于更好的利用多处理器资源;
3、封装处理各种I/O操作及状态,采用无共享锁/无引用计数设计,控制逻辑清晰、简单,用户应用程序无须关心I/O操作细节,只需要关心业务逻辑的具体实现;
4、提供多级tcp server访问处理机制,非常容易实现各种代理服务器;
5、提供echo_server/echo_client、ssl_server/ssl_client、proxy_server、http_server(基于asio的http server示例)等示例供参考。
bas代码中包含了详细的注解(英文,但不一定准确,请谅解),示例程序也演示了基本的用法,这里主要将两个模板参数类的具体实现要求说明如下:
1、由Work_Allocator类负责新建Work_Handler类实例,必须实现如下函数:
make_handler: 新建一个Work_Handler类实例;
make_socket: 新建一个tcp::socket或ssl::stream类实例,看起来是比较奇怪的设计,不过为了适用于创建ssl::stream类,必须从Work_Allocator类中获得context参数;
2、Work_Handler类负责执行业务逻辑,必须实现如下函数:
clear: 连接开始前被调用,目的是将所有内部变量清除为初始状态;
on_open: 当连接建立成功后将首先被调用,参数为负责I/O操作的service_handler对象;
on_read: 当读操作正常完成后被调用,参数为负责I/O操作的service_handler对象和成功读取数据长度;
on_write: 当写操作正常完成后被调用,参数为负责I/O操作的service_handler对象;
on_close: 当连接关闭时被调用,参数为负责I/O操作的service_handler对象和错误原因,错误原因主要包括:
0, 操作成功完成,连接正常关闭;
boost::asio::error::eof, 操作成功完成,连接被对端干净的关闭;
boost::asio::error::timed_out,操作超时未完成;
其他类型的I/O错误请参见<boost/asio/error.hpp>的定义;
on_parent: 从父连接接收到事件时被调用,参数为负责I/O操作的service_handler对象和事件内容;
on_child: 从子连接接收到事件时被调用,参数为负责I/O操作的service_handler对象和事件内容;
在上述函数中,可通过调用service_handler对象的async_read_some、async_read、async_write等函数实现I/O操作,需要主动关闭连接时调用close即可。具体用法请参考示例;
另外,为了实现无锁设计,所有I/O操作及业务操作任务分别被分派到不同但固定的线程执行。如果业务处理任务负载非常小,将会发生不必要的额外线程切换。但是考虑到逻辑清晰而简单的需要(correct is better than fast, simple is better than complex, clear is better than cute, safe is better than insecure.-- Sutter and Alexandrescu, C++ Coding Standards),且实际的用户应用程序的业务处理任务负载应该比较繁重,所以最终保留了现有的设计。
项目地址:
http://code.google.com/p/baserver/
源码地址:
http://code.google.com/p/baserver/source/browse/#svn/trunk
下载地址:
http://code.google.com/p/baserver/downloads/list
分享到:
相关推荐
C++中的TFTP服务器实现:基于Boost.ASIO+Boost.Spirit,仅标头且微不足道。
boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型。 boost.asio库支持TCP、UDP、ICMP通信协议。 下面介绍同步TCP模式: 大家好!我是同步方式! 我的主要特点...
Boost.asio学习 下载地址: https://legacy.gitbook.com/book/mmoaay/boost-asio-cpp-network-programming-chinese/details
该c++ web server基于boost.asio库编写,同时支持http和https协议。该工程基于vs2015编译通过,相关配置和说明见readme.txt
Boost.Asio 对网络编程做了一个极好的抽 象,从而保证只需要少量的代码就可以实现一个优雅的客户端/服务端软件。在实现 的过程中,它能让你体会到极大的乐趣。而且更为有益的是:Boost.Asio 还包含了 一些非网络的...
Asio 是一个跨平台的 C++ 库,常用于网络编程、底层的 I/O 编程等 (low-level I/O),其结构框架如下: 2 使用 Asio 2.1 下载 Asio 库分为 Boost 版和 non-Boost 版,后者的下载地址为: http://think-async.com/ ...
Boost 1.72.0版本 Asio文档的中文翻译,中英文对照,PDF格式。 对应英文文档为[Boost.Asio](https://www.boost.org/doc/libs/1_72_0/doc/html/boost_asio.html)。 翻译了“Overview”、“Using Boost.Asio”、...
boost asio网络编程入门教程,可以作为学习参考
包含asio入门知识,基本原理,服务端/客户端实例讲解,通用服务端/客户端构建的关键技术与技术细节,同步与异步处理,asio高级特性,asio中其它功能特性等。 面向的读者: 这本书对于那些需要做网络编程却不想深入...
通过boost::asio::serialport类实现串口通信的例子
boost库中asio的简单应用,一个服务器一个客户端
bas为boost_asio_server(baserver)的简称,是采用Half-Sync/Half-Async模式的服务器框架,使用c++实现,能够大大简化tcp server的开发工作。bas目前实现了以下功能: 1、底层基于boost及asio实现,支持ssl,跨越...
C++网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装-附件资源
boost::asio tcp服务器的实现 封装socket, 监听socket, C++11智能指针, 要求: vs2012或以上版本
这是一个由 Boost.Asio 提供支持的简单 D-Bus 绑定。 我尽可能地遵循 Asio 的习惯用法。 代码示例 # include # include < boost> # include using namespace std ; using namespace boost ::asio ; using boost::...
C++ boost::asio编程-域名解析 在网络通信中通常我们并不直接使用IP地址,而是使用域名。这时候我们就需要用reslover类来通过域名获取IP,它可以实现 与IP版本无关的网址解析。 #include stdafx.h #include boost/...
boost::asio::serial下6个工程演示多种串口读取写入方式方法,包含simple,with_timeout,async,callback,qt_integration,stream 等多个工程演示多种方式读取,写入串口,char,string ,buffer[]等多种数据格式。