项目模块十二:TcpServer模块

news/2024/11/6 11:51:26/

一、模块设计思路

1、目的

对所有模块整合,实现一个服务器模块供外部快速搭建服务器

2、管理

监听套接字

主 Reactor,创建 EventLoop _baseloop 对象,进行对监听套接字的管理

哈希表管理所有新连接的 Channel

创建线程池进行连接的事件处理

3、功能

设置线程数量

启动服务器

设置新连接回调函数(外部传入连接建立,业务处理,关闭连接,任意事件等待回调函数,TcpServer 再设置给 Connection 最后完成监听套接字的读事件回调函数)

是否启动非活跃连接定时销毁

添加定时任务

4、流程

TcpServer 中创建 Acceptor 对象,并用 _baseloop 对象进行管理

Acceptor 读事件就绪,接收新连接,调用读事件回调函数

创建 Connection 管理新连接

设置新连接回调函数

启动 Connection 超时连接销毁

新连接绑定线程池中返回的下一个线程进行线程安全的事件监控

有事件就绪新连接就处理回调函数

二、成员变量

分配接收到的新连接 id:uint64_t _connid;

绑定端口号:int _port;

超时任务时间:int _timeout;

是否开启超时销毁:bool _inactive_release;

主 Reactor:EventLoop _baseloop;

监听套接字:Acceptor _acceptor;

线程池:LoopThreadPool _pool;

记录新连接:unordered_map<uint64_t, PtrConnection> _conns;

四个外部传入的回调函数:

using ConnectedCallback = function<void(const PtrConnection &)>;

using MessageCallback = function<void(const PtrConnection &, Buffer *)>;

using CloseCallback = function<void(const PtrConnection &)>;

using EventCallback = function<void(const PtrConnection &)>;

using Functor = function<void()>;

ConnectedCallback _connected_callback; // 连接建立后的回调函数

MessageCallback _message_callback;     // 业务处理的回调函数

CloseCallback _close_callback;         // 关闭连接的回调函数

EventCallback _event_callback;         // 任意事件的回调函数

三、成员函数

1、私有函数1:获取新连接后的设置操作(相当于监听套接字读回调)void ConnCallback()

新连接 id++

为新连接创建 Connection,并设置5个回调函数

开启非活跃连接销毁

新连接开始监控读事件

添加新连接

注意:要先非活跃再监控读事件,因为在读事件的回调里面有刷新任务,如果找不到任务队列就会报错

2、私有函数2:删除服务器记录的连接(线程安全) void RemoveConnectionInLoop(const Connection &conn)

找到哈希表里面的指定连接删除

3、私有函数3:删除服务器记录的连接 void RemoveConnecction(const Connection &conn)

绑定 _baseloop 里面的 RunInLoop 函数

4、私有函数4:添加定时任务(线程安全)void AddTaskInLoop(const Functor &task, int timeout)

调用 _baseloop 里面的 TimerAdd 函数

5、公有函数1:构造函数

主 Reactor 要在监听套接字之前初始化

线程池的构造不能在构造函数里面完成,要等线程池数量确定后在启动接口里面初始化

设置监听套接字的读回调函数后,启动监听

6、公有函数2:设置线程数量 void SetThreadCount(int count)

调用 _pool 里面的设置线程数量函数

7、公有函数3:启动非活跃连接销毁 void EnableInactiveRelease(int timeout)

设置非活跃标志位

设置延迟时间

8、公有函数4:添加定时任务 void AddTask(const Functor &task, int timeout)

绑定 _baseloop 里面的 RunInLoop 函数

9、公有函数5:开启服务器 void Start()

线程池初始化

_baseloop 启动

10、设置4个外部回调 

有一个服务器删除连接回调已经在私有函数里面实现,用于新连接的5个回调函数实现

四、代码展示


http://www.ppmy.cn/news/1544811.html

相关文章

python类方法、实例方法以及相互关系

在Python中&#xff0c;类方法&#xff08;class method&#xff09;是一种特殊类型的方法&#xff0c;它使用类本身作为第一个参数&#xff0c;而不是实例对象。类方法通常用于定义与类本身相关但不需要访问实例属性的操作。类方法的第一个参数通常命名为cls&#xff0c;以区别…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十九集:制作过场Cutscene系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作过场Cutscene系统 1.制作基本的视频过场和动画过场2.制作决定过场系统的播放顺序Sequence以及切换场景以后的逻辑处理二、制作跳过过场Cutscene的MenuS…

Webserver(3.3)生产者消费者模型

目录 生产者消费者简单模型条件变量信号变量 生产者消费者简单模型 //生产者消费者模型#include <stdio.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h>struct Node{int num;struct Node * next; }; //头结点 struct Node * headNULL…

unreal engine5动画重定向

UE5系列文章目录 文章目录 UE5系列文章目录前言一、下载动画资源二、创建IK Rig&#xff08;IK绑定&#xff09; 前言 在Unreal Engine 5.4中&#xff0c;动画重定向&#xff08;Animation Retargeting&#xff09;和动作匹配&#xff08;Motion Matching&#xff09;是两种不…

PL端:LED闪烁

实验环境 vivado2024.1 实验任务 LED闪烁 引脚关系 硬件配置 新建一个vivado实验 创建 Verilog HDL 文件点亮 LED 点击 Project Manager 下的 Add Sources 图标&#xff08;或者使用快捷键 AltA&#xff09; 编辑led.v module led(input sys_clk,input rst_n,outp…

C语言中如何实现动态内存分配

在C语言中&#xff0c;动态内存分配是通过标准库中的malloc、calloc和free函数实现的。这些函数允许程序在运行时请求内存&#xff0c;从而提供灵活性&#xff0c;尤其是在不知道所需内存大小的情况下。下面是对这三个函数的详细解释和使用示例。 1. malloc malloc&#xff0…

electron 中 ipcRenderer 作用

1. 理解 IPC&#xff08;进程间通信&#xff09;的背景 在 Electron 应用中&#xff0c;有主进程&#xff08;main process&#xff09;和渲染进程&#xff08;renderer process&#xff09;之分。 主进程&#xff1a;负责管理应用程序的生命周期、创建和管理窗口等核心任务。…

【已解决】element-plus配置主题色后,sass兼容问题。set-color-mix-level() is...in Dart Sass 3

项目&#xff1a;vue3vite "scripts": {"dev": "vite","build": "vite build","preview": "vite preview"},"dependencies": {"element-plus/icons-vue": "^2.3.1",&quo…