学习C++项目——一个基于C++11简单易用的轻量级网络编程框架 1

一个基于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

三、总结

  接下来就是对每个文件进行理解学习,短时间要把这个项目给大致理解,不懂的知识查阅理解。接下来重点部分和难点部分会理解记录。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值