一个基于C++11简单易用的轻量级网络编程框架
一、项目下载、导入、编译和运行
现在准备深入学习 C++ ,先肝一个项目,这个项目是《一个基于C++11简单易用的轻量级网络编程框架》,下载地址为:
Gitee: https://gitee.com/xia-chu/ZLToolKit
Github: https://github.com/ZLMediaKit/ZLToolKit (更详细)
我使用的环境是虚拟机,虚拟机是 VMware,系统是 CentOs ,这里环境只要有一个 Linux 系统环境要求就可以。下载以后的文件为:ZLToolKit-master.zip,在终端输入,
unzip ZLToolKit-master.zip
这样就解压成功了,并且把解压后的文件改为 ZLToolKit 。
按照项目中 README.txt 要求,需要如下配置,
## 编译(Linux)
- 我的编译环境
- Ubuntu16.04 64 bit + gcc5.4(最低gcc4.7)
- cmake 3.5.1
- 编译
cd ZLToolKit
./build_for_linux.sh
但是对于一个新的 Linux 系统,我的是 CentOS 8.4,需要安装 gcc 的功能,需要安装 MySQL 才能运行成功。经过多次尝试,找到了这个博客有效,安装 MySQL 推荐这个博客:
https://www.baidu.com/link?url=1uWJ7a-kHWb5bNOmG0a9_isilVpXlXxK3EG19gnxiX0w6I1Qsg3GDCSZrduhdUQthzGjVGYmH53E9V_zz9KcRa&wd=&eqid=8dd7ef6e000012e80000000361517bf5
还有一点需要注意,假如自己创建了用户,比如我的是 wzjvv ,权限是会受到很多限制的,很多操作需要 root 权限才可以操作,自己权限也可以设置,我一般选择的是切换,使用
[wzjvv@bogon ZLToolKit]$ su
密码:
输入密码以后就会切换到 root 管理员模式下,
[root@bogon ZLToolKit]#
对于用户是用 $ 标识,对于管理员是用 # 表示。
如果要修改某个文件下子目录文件的所有权限,需要在管理员模式下运行,使用
[root@bogon ZLToolKit]# chmod -R 777 build(yourFile)
因此我的环境如下,
## 编译(Linux)
- 我的编译环境
- CentOS 8.4 64 bit + (gcc 8.4.1)
- cmake 3.18.2
- MySQL 8.0.26
- 编译
cd ZLToolKit
./build_for_linuxMine.sh
build_for_linuxMine.sh 文件如下(我自己做过修改,把下载部分删除了):
#!/bin/bash
cd ..
cd ZLToolKit
mkdir -p linux_build
rm -rf ./build
ln -s ./linux_build ./build
cd linux_build
cmake ..
make -j4
最后编译运行结果如下,
编译成功,我也不知道具体代表什么意思,但是接下来可以开始看原理和内容了。第一个项目总算可以开始肝起来了。
二、项目整体框架
这个项目的特点如下,
1. 基于C++11开发,避免使用裸指针,代码稳定可靠;同时跨平台移植简单方便,代码清晰简洁。
2. 使用epoll+线程池+异步网络IO模式开发,并发性能优越。
3. 代码经过大量的稳定性、性能测试,可满足商用服务器项目。
项目特性,
-> 网络库
1. tcp/udp客户端,接口简单易用并且是线程安全的,用户不必关心具体的socket api操作。
2. tcp服务器,使用非常简单,只要实现具体的tcp会话(TcpSession类)逻辑,使用模板的方式可以快速的构建高性能的服务器。
3. 对套接字多种操作的封装。
-> 线程库
1. 使用线程实现的简单易用的定时器。
2. 信号量。
3. 线程组。
4. 简单易用的线程池,可以异步或同步执行任务,支持functional 和 lambad表达式。
-> 工具库
1. 文件操作。
2. std::cout风格的日志库,支持颜色高亮、代码定位、异步打印。
3. INI配置文件的读写。
4. 监听者模式的消息广播器。
5. 基于智能指针的循环池,不需要显式手动释放。
6. 环形缓冲,支持主动读取和读取事件两种模式。
7. mysql链接池,使用占位符(?)方式生成sql语句,支持同步异步操作。
8. 简单易用的ssl加解密黑盒,支持多线程。
9. 其他一些有用的工具。
10. 命令行解析工具,可以很便捷的实现可配置应用程序
文件目录如下,
具体为
// 编译文件
build_for_android.sh // android 下编译
build_for_ios.sh // ios 下编译
build_for_linux.sh // linux 下编译
build_for_linuxMine.sh // 我自己改了一部分
build_for_mac.sh // macOS 下编译
// 源代码 + 核心文件 + 测试文件
cmake // make 文件,不理解
src // 程序源代码
tests // 测试文件
usr // 库文件
linux_build // 编译得到的文件
CMakeLists.txt // 不太理解,和 makefile 有关
// 版权和使用方法
qlclient-dev // 不太清楚
LICENSE // 版权声明
README.md // 关于项目描述
源代码放在了 src 文件下,模块如下,
src
|
|-- NetWork # 网络模块
| |-- Socket.cpp # 套接字抽象封装,包含了TCP服务器/客户端,UDP套接字
| |-- Socket.h
| |-- sockutil.cpp # 系统网络相关API的统一封装
| |-- sockutil.h
| |-- TcpClient.cpp # TCP客户端封装,派生该类可以很容易实现客户端程序
| |-- TcpClient.h
| |-- TcpLimitedSession.h # 派生于TcpSession,该模板类可以全局限制会话数量
| |-- TcpServer.h # TCP服务器模板类,可以很容易就实现一个高性能私有协议服务器
| |-- TcpSession.h # TCP服务私有协议实现会话基类,用于处理TCP长连接数据及响应
|
|-- Poller # 主线程事件轮询模块
| |-- EventPoller.cpp # 主线程,所有网络事件由此线程轮询并触发
| |-- EventPoller.h
| |-- Pipe.cpp # 管道的对象封装
| |-- Pipe.h
| |-- PipeWrap.cpp # 管道的包装,windows下由socket模拟
| |-- SelectWrap.cpp # select 模型的简单包装
| |-- SelectWrap.h
| |-- Timer.cpp # 在主线程触发的定时器
| |-- Timer.h
|
|-- Thread # 线程模块
| |-- AsyncTaskThread.cpp # 后台异步任务线程,可以提交一个可定时重复的任务后台执行
| |-- AsyncTaskThread.h
| |-- rwmutex.h # 读写锁,实验性质的
| |-- semaphore.h # 信号量,由条件变量实现
| |-- spin_mutex.h # 自旋锁,在低延时临界区适用,单核/低性能设备慎用
| |-- TaskQueue.h # functional的任务列队
| |-- threadgroup.h # 线程组,移植自boost
| |-- ThreadPool.h # 线程池,可以输入functional任务至后台线程执行
| |-- WorkThreadPool.cpp # 获取一个可用的线程池(可以加入线程负载均衡分配算法)
| |-- WorkThreadPool.h
|
|-- Util # 工具模块
|-- File.cpp # 文件/目录操作模块
|-- File.h
|-- function_traits.h # 函数、lambda转functional
|-- logger.h # 日志模块
|-- MD5.cpp # md5加密模块
|-- MD5.h
|-- mini.h # ini配置文件读写模块,支持unix/windows格式的回车符
|-- NoticeCenter.h # 消息广播器,可以广播传递任意个数任意类型参数
|-- onceToken.h # 使用RAII模式实现,可以在对象构造和析构时执行一段代码
|-- ResourcePool.h # 基于智能指针实现的一个循环池,不需要手动回收对象
|-- RingBuffer.h # 环形缓冲,可以自适应大小,适用于GOP缓存等
|-- SqlConnection.cpp # mysql客户端
|-- SqlConnection.h
|-- SqlPool.h # mysql连接池,以及简单易用的sql语句生成工具
|-- SSLBox.cpp # openssl的黑盒封装,屏蔽了ssl握手细节,支持多线程
|-- SSLBox.h
|-- TimeTicker.h # 计时器,可以用于统计函数执行时间
|-- util.cpp # 其他一些工具代码,适配了多种系统
|-- util.h
|-- uv_errno.cpp # 提取自libuv的错误代码系统,主要是为了兼容windows
|-- uv_errno.h
三、总结
接下来就是对每个文件进行理解学习,短时间要把这个项目给大致理解,不懂的知识查阅理解。接下来重点部分和难点部分会理解记录。