简介
这是一个基于 Linux 平台的 IO 框架,其特点是精简易用、灵活高效。
框架被合理拆分为通信层、协议层与业务层,各层都应用面向对象设计实现了高内聚、低耦合,通过多层派生充分复用共性代码,最大程度减少冗余。通信层又横向拆分为通道类和监视器类,通道类负责数据传输,通过派生与组合可灵活支持多种通信方式(串口,蓝牙,TCP,SSL),监视器类管理和调度通道,其中应用了 select/epoll 等 IO 多路复用技术,保证了单线程 IO 效率。协议层采用状态机实现数据解析,这其实是在手动模拟协程,解析过程可随时暂停和重入,以充分发挥非阻塞 IO 的效率。值得一提的是,协议类和通道类之间的耦合,并未简单使用组合关系,而是基于函数式编程**(函数是一等公民、闭包提供更小粒度的变量绑定),将二者关联起来,使得“不需要协议的通道”这一语义能够自然表达,避免了冗余代码。此外,我还编写了简易线程池和环形队列等工具类,以便支持更高要求的 IO 业务。
最后,我基于这个框架编写了几个应用 demo,如聊天程序、协议通信、多线程 HTTP 文件下载等(其中也应用了较多现代 C++ 特性)。整个项目都使用 gn/ninja 工具组织构建,不仅编译速度快,且便于维护和扩展。
编译构建
环境依赖
-
linux 系统
-
gcc 工具链
-
openssl 开发库
用 gn 生成 ninja 编译描述文件
仓内已经预置了 gn 和 ninja 工具(linux 64位版),直接执行如下命令:
./build/gn gen -C out
用 ninja 编译所需的应用/测试模块
为了演示 EasyIO 框架的用法,在 usage 目录下给出了一些示例应用程序,对应的可执行模块名请查看根目录下的 BUILD.gn 文件,例如编译其中的 HTTP 多线程下载器http_downloader
,执行以下命令:
./build/ninja -C out http_downloader
如果需要构建 usage 目录下的所有演示程序,则执行:
./build/ninja -C out
构建出的可执行文件都在 out 目录中。