发布一个开源的c++网络事件库【转载Zark@cppthinker.com】

简介: Chaos是一个基于Linux平台, reactor模式的网络事件库, 目前仅支持TCP传输协议, 仅在x86_64下编译, 并遵循3-clause BSD开源协议. 在使用上, 可以说它很像boost asio, 可能是由于我对boost asio的接口设计很有爱吧, 而且对于boost asio...

Chaos是一个基于Linux平台, reactor模式的网络事件库目前仅支持TCP传输协议仅在x86_64下编译并遵循3-clause BSD开源协议在使用上可以说它很像boost asio, 可能是由于我对boost asio的接口设计很有爱吧而且对于boost asio在异步编程方面的思想我个人也比较认同但至今我也没有仔细阅读过boost asio的源码一是boost的模板化编程在可读性上让我比较折磨其二则是不想在对设计先入为主的情况下去开发chaos, 很多事情只有我们自己亲自去思考才能有所收获.

 
    进入主题关于chaos库源码和所有测试用例和应用服务都在https://github.com/lyjdamzwf/chaos下载
 
 
源码目录结构
 
chaos                                   - chaos库源码
async_method                        - 用于异步消息队列的实现, 是最小的task单位, 类似于boost::bind & boost:function
utility                                   - 常用工具类
thread                                  - 对pthread的封装
task_service                          - 核心模块, 包含了异步消息队列, 网络I/O管理, 以及超时事件,ask_service可以作为多线程异步编程强大的工具而不单单作为一个网络层的reactor模块(相当于boost asio的io_service)
log                                       - 日志组件
heart_beat                            - 基于task_service的通用型元素心跳管理.
network                                - 基于task_service, 对tcp server进行了封装, 底层I/O multiplexing使用epoll LT模式, 提供了常用的socket行为, 统一对连接进行管理, 并提供了用户空间的读写缓冲区, 可以使开发者快速地搭建一个tcp服务器
test                                     - 一些测试用例, 小到一个工具类的测试, 大到不同类型的服务器程序
 
 
简单的TCP Server
要建立一个tcp server, 使用chaos只要简单的三步:
 
1.首先我们要先定义一个连接事件回调, 当chaos发现任何连接状态的改变都会回调该函数

 
 
2. 连接策略类的定义, 该类告诉chaos对于tcp数据包如何处理

这里需要特别说明一点的是, 对于tcp字节流的处理, chaos底层有默认的机制, 当一个完整的数据包被读取之后, handle_packet就会被调用, 可以看到, 服务在收到完整的数据包之后, 发送了同样的内容给对端.

默认策略的实现就在test_server_echo_conn_t所继承的default_conn_strategy_t中, 该类对所有tcp字节流的处理流程是:

 
默认策略的包头成员:

如果你希望使用自己的tcp字节流解析策略, 那么可以自己继承chaos::network::connection_t进行实现, 在初始化服务的时候注入自己的策略即可, 具体方式是提供一个你继承自connection_t的类, 然后作为tcp_service_t的模板参数
 
 
3.初始化并启动服务

    chaos::network::tcp_service_t类的运行机制是固定一个线程做accept的工作, 而accept成功的连接会分派到各个work线程上进行I/O, work线程的数量可在start时指定.
    这样就完成了一个简单的tcp echo server的建立,  以上只是我截取的关键代码片段, 在chaos/test/echo_server目录中有完整的代码可供参考.

 

如何生成并应用chaos到自己的项目

chaos目前提供的链接方式是以静态库(.a)存在的, 你可以运行根目录下的build_all.sh脚本进行生成(需要安装automake软件), 你不需要再安装任何第三方库即可编译整个chaos, 当编译完成后会在根目录生成lib临时目录,里面即包含相应的chaos静态库, 之后可参照test目录下的用例的方式链接到自己的项目中.

 

网络库之外看chaos

    之前我曾提到task_service不仅仅是作为一个网络库的Reactor核心, 它亦可作为日常开发当中多线程及异步编程的利器, 让你不用关心线程切换, 多线程消息投递等细节问题, 通过简单地将请求包装成一个异步方法, 投递到指定的task_service(线程池)中, 就能执行该任务, 在之后的系列文章中我会做详细分析.

 

Chaoslibevent, boost asio, ACE, ICE等知名库的不同之处

    从开始写chaos时, 我的初衷可能就不是libevent, boost asio那样的通用库, 而是帮助使用者快速搭建一个简单易用的tcp服务, 基于reactor核心写的network模块也是出于这个目的而做的封装. 如果使用libevent或boost asio, 你依然要关心如何去接受一个连接, 去创建启动线程, 去驱动EventLoop, 考虑如何分配线程, 如何管理连接, 而如果使用ACE, ICE, 又会显得比较臃肿庞大, 另一个角度看, ICE是个网络服务解决方案, 而不是单纯的网络库, 而chaos就介于他们之间, 即保持着一定的轻量化, 也希望使用者能够足够易用快速开发, 当然, 这样也必然会失去一些灵活性, 但我个人觉得这对于绝大部分应用都无伤大雅.

 

性能

    对于部分应用来讲, 虽然网络层不会成为整个服务的瓶颈所在, 但网络库的性能依然至关重要, 我个人认为在本机做吞吐量的测试是一个不错的途径, 而且不用考虑硬件网卡的限制, 我的方法是在同样的机器环境上, 根据不同的应用层缓冲区大小, 连接数, 单线程/多线程 这几个方面来评测.

    具体流程是, 客户端启动N个线程并启动N个TCP连接向服务器发送数据, 服务器接收到完整的数据包之后马上回传相同内容给对端(如同上面的echo server), 一段时间后统计整个过程的吞吐量, 以下是我统计的相关数据:

 

测试环境信息

服务器型号: HP DL160

CPU: E5504

MEM:

OS: centOS 5.8

 

当然, 需要一提的是这份吞吐量测试报告和其他一些网络库的吞吐量测试没有太大的可对比性, 毕竟不同的硬件环境,不同的测试代码给结果带来的差距比我们想象当中的要大.

吞吐量的测试客户端可在test/throughput_client目录中找到完整的代码

服务器代码见echo_server

 

待续

    之后我会根据个人时间继续推出一些系列的文章和大家分享, 继续讨论chaos的一些设计上遇到的问题, 同时库本身还存在很多问题, 我会继续完善下去.

 

    更多信息请关注:

    新浪微博         -   http://weibo.com/crazyprogramerlyj

    ChinaUnix博客 -    http://blog.chinaunix.net/space.php?uid=14617649
目录
相关文章
|
7月前
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
5月前
|
Linux 虚拟化 iOS开发
GNS3 v3.0.5 - 开源免费网络模拟器
GNS3 v3.0.5 - 开源免费网络模拟器
408 3
GNS3 v3.0.5 - 开源免费网络模拟器
|
6月前
|
人工智能 搜索推荐 开发者
GPT-4o测评准确率竟不到1%!BrowseComp:OpenAI开源AI代理评测新基准,1266道高难度网络检索问题
OpenAI最新开源的BrowseComp基准包含1266个高难度网络检索问题,覆盖影视、科技、艺术等九大领域,其最新Deep Research模型以51.5%准确率展现复杂信息整合能力,为AI代理的浏览能力评估建立新标准。
331 4
GPT-4o测评准确率竟不到1%!BrowseComp:OpenAI开源AI代理评测新基准,1266道高难度网络检索问题
|
9月前
|
数据采集 人工智能 自然语言处理
FireCrawl:开源 AI 网络爬虫工具,自动爬取网站及子页面内容,预处理为结构化数据
FireCrawl 是一款开源的 AI 网络爬虫工具,专为处理动态网页内容、自动爬取网站及子页面而设计,支持多种数据提取和输出格式。
3133 71
FireCrawl:开源 AI 网络爬虫工具,自动爬取网站及子页面内容,预处理为结构化数据
|
6月前
|
机器学习/深度学习 人工智能 运维
AI“捕风捉影”:深度学习如何让网络事件检测更智能?
AI“捕风捉影”:深度学习如何让网络事件检测更智能?
175 8
|
9月前
|
机器学习/深度学习 人工智能 搜索推荐
PaSa:字节跳动开源学术论文检索智能体,自动调用搜索引擎、浏览相关论文并追踪引文网络
PaSa 是字节跳动推出的基于强化学习的学术论文检索智能体,能够自动调用搜索引擎、阅读论文并追踪引文网络,帮助用户快速获取精准的学术文献。
604 15
|
11月前
|
机器学习/深度学习
NeurIPS 2024:标签噪声下图神经网络有了首个综合基准库,还开源
NoisyGL是首个针对标签噪声下图神经网络(GLN)的综合基准库,由浙江大学和阿里巴巴集团的研究人员开发。该基准库旨在解决现有GLN研究中因数据集选择、划分及预处理技术差异导致的缺乏统一标准问题,提供了一个公平、用户友好的平台,支持多维分析,有助于深入理解GLN方法在处理标签噪声时的表现。通过17种代表性方法在8个常用数据集上的广泛实验,NoisyGL揭示了多个关键发现,推动了GLN领域的进步。尽管如此,NoisyGL目前主要适用于同质图,对异质图的支持有限。
199 7
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
96 0
|
4月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
173 0

热门文章

最新文章