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

三、总结

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

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

  1. Magnolia学习笔记(一个基于JSR170的内容管理系统) ( by quqi99 )

                         Magnolia学习笔记(一个基于JSR170的内容管理系统) ( by quqi99 ) 作者:张华 发表于:2007-05-24  ( http://bl ...

  2. 基于RxJava2+Retrofit2简单易用的网络请求实现

    代码地址如下: http://www.demodashi.com/demo/13473.html 简介 基于RxJava2+Retrofit2实现简单易用的网络请求,结合android平台特性的网络封 ...

  3. retrofit 会请求两次_基于RxJava2+Retrofit2简单易用的网络请求实现

    简介 基于RxJava2+Retrofit2实现简单易用的网络请求,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置,上传下载 ...

  4. 基于c++和asio的网络编程框架asio2教程基础篇:1、基本概念和使用说明

    基于c++和asio的网络编程框架asio2教程基础篇:1.基本概念和使用说明 由于asio2没有写技术文档,因此打算写几篇文章介绍一下如何使用它,主要是针对新手. 1.asio2如何使用? asio ...

  5. 基于c++和asio的网络编程框架asio2教程基础篇:2、各个回调函数的触发顺序和执行流程

    基于c++和asio的网络编程框架asio2教程基础篇:2.各个回调函数的触发顺序和执行流程 以tcp举例: tcp服务端流程: #include <asio2/asio2.hpp>int ...

  6. 自荐Mall4j项目一个基于spring boot的Java开源商城系统

    前言 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样 ...

  7. 如何做一个基于python校园失物招领系统毕业设计毕设作品(Django框架)

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):基于Python(Django框架)的网站开发属于B/S架构(即浏览器和服务器架构模式), ...

  8. 如何做一个基于JAVA失物招领网站系统毕业设计毕设作品(springboot框架)

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):基于JAVA的网站开发属于B/S架构(即浏览器和服务器架构模式),架构如图 分析系统功能 ...

  9. 如何做一个基于JAVA二手交易网站系统毕业设计毕设作品(springboot框架)

    分析架构 我们开发系统,常规有两个架构,一个BS架构(浏览器/服务器模式),一个CS(客户端/服务器端模式):基于JAVA的网站开发属于B/S架构(即浏览器和服务器架构模式),架构如图 分析系统功能 ...

最新文章

  1. 并发编程的那些事。(二)
  2. Unity应用架构设计(9)——构建统一的 Repository
  3. 51单片机 驱动步进电机 C语言 lcd,51单片机红外遥控控制步进电机的LCD显示源程序...
  4. 《Imperfect C++中文版》——1.3 运行期契约:前置条件、后置条件和不变式
  5. HTML列表标记符有哪些,在HTML中,表格标记符为( )
  6. SpringBoot集成Maven工程
  7. java如何处理tcp异常断开_(转)TCP连接异常断开检测
  8. EasyUI:Tabs 标签页/选项卡
  9. 如何加载和保存AutoCAD DXF文件(四参数法)
  10. android设置闹钟日期,在Android中将闹钟设置为特定日期和时间
  11. FaceBook 遭遇有史以来全球最大宕机
  12. [TJOI2019]唱、跳、rap和篮球_生成函数_容斥原理_ntt
  13. id门禁卡复制到手机_怎么把手机变成门禁卡 手机NFC复制门禁卡图文教程
  14. 零基础如何学 Web 前端开发
  15. 让搜索引擎收录hexo博客 | hexo
  16. 21考研上岸吉大人工智能学院考研复习策略
  17. 使用EditPlus技巧,提高工作效率(附英文版、自动完成文件、语法文件下载)
  18. muParser公式库使用简介( 转)
  19. 多线程之interrupt
  20. freecodecamp_freeCodeCamp如何使我成为最新的训练营毕业生

热门文章

  1. [转]35岁前程序员要规划好的四件事,健康居首位
  2. [.NET]使用十年股价对比各种序列化技术
  3. Kotlin中变量不同于Java: var 对val(KAD 02)
  4. 02.XMemcached的使用
  5. Advance Installer安装问题
  6. Google PR 到4了
  7. windows 的一些快捷键
  8. Flash:LoadVars数据提交与表单处理
  9. shell编程脚本练习题
  10. IBM为私有云用户提供开源数据库访问