浏览 10298 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-08
最后修改:2009-04-13
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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-04-08
有没考虑基于asio实现个leader followers?
|
|
返回顶楼 | |
发表时间:2009-04-09
也不是没有考虑过Leader/Followers,甚至考虑过混合模式,经过权衡后,才确定采用目前的方案。
|
|
返回顶楼 | |
发表时间:2009-05-05
最后修改:2009-05-06
有一个建议不知道是否可行,就是在开源的基础上,把主要的网络协议对应的Work_Handler类分别整理、实现,有需要的就可以选择使用。
|
|
返回顶楼 | |