c++项目:one thread oneloop式并发服务器实现(一)
创始人
2024-11-08 18:35:36
0

更新中......

前言:本项目基于muduo库,通过模仿,实现实现出一个高并发服务器组件,通过该组件,可以简洁快速的搭建出一个高性能的服务器。为了便于展示,本项目将实现一个基于Reactor模式的高性能TCP服务器。

目标定位:本项目实现的是主从Reactor模型服务器,主Reactor线程仅仅监听描述符,获取新连接保证获取连接的高效性,提高服务器的性能;当主Reactor获取到新连接后,会分发给子Reactor进行事件监控,子Reactor线程根据各自的描述符的读写事件进行数据读写以及处理业务。

功能模块划分:

整个项目包含两大模块:

  • SERVER模块:实现Reactor模型的TCP服务器;
  • 协议模块:对当前Reactor模型服务器提供应用层协议支持

SERVER模块:

此模块用于对所有连接以及线程进行管理,具体分为以下三个方面:

  • 监听事件管理
  • 通信连接管理
  • 超时连接管理

具体和划分为以下多个子模块:

Buffer模块:

用于实现通信套接字的用户缓冲区;

目的:1.为了防止接收到的数据不完整,因此对接收的数据进行缓冲;

           2.对于客户端相应的数据,应该是在套接字可写的情况下进行发送。

功能设计:向缓冲区添加&取出数据。

Socket模块:

对socket套接字进行封装,让程序对于套接字的各项操作更加简便;

功能设计:创建套接字、绑定地址信息、监听、发起连接、获取新连接、接收&发送数据、关闭套接字、创建监听连接、创建客户端连接

Channel模块:

对一个描述符进行监控事件管理,便于服务器维护以及触发事件后的操作流程更加清晰;

功能设计:

1.对监控事件的管理:检测描述符的IO状态、修改描述符的IO状态、接触对应事件的监控;

2.对监控事件触发后的处理:设置不同事件的回调处理函数;

Connection模块:

此模块是对上述对Buffer模块,Socket模块,Channel模块的⼀个整体封装,实现了一共对通信套接字的管理。

功能设计:

1.Connection模块内部包含有三个由组件使用者传入的回调函数:连接建立完成回调,事件回调, 新数据回调,关闭回调。

2.Connection模块内部包含有两个组件使用者提供的接口:数据发送接口,连接关闭接口。

3.Connection模块内部包含有两个用户态缓冲区:用户态接收缓冲区,用户态发送缓冲区。

4. Connection模块内部包含有⼀个Socket对象:完成描述符面向系统的IO操作。

5. Connection模块内部包含有⼀个Channel对象:完成描述符IO事件就绪的处理。

Acceptor模块:

此模块对Scoket模块、Channel模块进行整体封装,实现了对一个监听套接字的整体管理。

功能设计:

1.实现向Channel通过可读事件的IO事件处理回调函数。

2.为新链接创建一个Connection对象。

TimeQueue模块:

此模块为定时任务管理器模块,实现添加定时任务、删除定时任务、刷新定时任务,实现对Connection对象的生命周期管理。

功能设计:对通过linux系统提供的定时器实现IO时间就绪的回调处理。

Poller模块:

此模块是对epoll进行封装,实现epoll的IO事件添加、修改、移除、获取新连接。

EventLoop模块:

此模块是对Poller模块、TimerQueue模块、Socket模块的一个整体封装,进行所有描述符的事件监控。

功能设计:

1.eventLoop模块内部包含有⼀个eventfd:专门用于事件通知。

2.EventLoop模块内部包含有⼀个Poller对象:用于进行描述符的IO事件监控。

3.EventLoop模块内部包含有⼀个TimerQueue对象:用于进行定时任务的管理。

4.EventLoop模块内部包含有⼀个PendingTask队列:组件使用者将对Connection进行的所有操作, 都加入到任务队列中,由EventLoop模块进行管理,并在EventLoop对应的线程中进行执行。(EventLoop模块必然是⼀个对象对应⼀个线程的模块,线程内部的目的就是运行EventLoop的启动函数)

5.每一个Connection对象都会绑定到一个EventLoop上,可以可以保证对这个连接的所有事件都是在一个线程中完成的。

TcpServer模块:

此模块是一个整体的Tcp服务器的封装,内部封装了Acceptor模块、EventLoopThreadPool模块(EventLoop线程池)。

功能实现:

1.TcpServer中包含有⼀个EventLoop对象:以备在超轻量使用场景中不需要EventLoop线程池,只需要在主线程中完成所有操作的情况。

2.TcpServer模块内部包含有⼀个EventLoopThreadPool对象:其实就是EventLoop线程池,也就是 子Reactor线程池。

3.TcpServer模块内部包含有⼀个Acceptor对象:⼀个TcpServer服务器,必然对应有⼀个监听套接 字,能够完成获取客客户端新连接,并处理的任务。

4.TcpServer模块内部包含有⼀个std::shared_ptr的hash表:保存了所有的新建连接 对应的Connection,注意,所有的Connection使用shared_ptr进行管理,这样能够保证在hash表 中删除了Connection信息后,在shared_ptr计数器为0的情况下完成对Connection资源的释放操作。

相关内容

热门资讯

实测交流!好友赣南斗牛外 挂(... 实测交流!好友赣南斗牛外 挂(辅助挂)外挂透明挂辅助app(2021已更新)(哔哩哔哩)1、好友赣南...
wepoke作弊器!nzt德州... wepoke作弊器!nzt德州果真真的有挂,微扑克ai辅助器苹果版规律1、进入到微扑克ai辅助器苹果...
玩家交流!中至都昌讨赏有挂吗(... 玩家交流!中至都昌讨赏有挂吗(辅助挂)竟然真的是有挂(2024已更新)(哔哩哔哩)1)中至都昌讨赏有...
二分钟介绍!天天斗地主修改器,... 二分钟介绍!天天斗地主修改器,星悦云南麻将有没有假(果然有挂);1、完成星悦云南麻将有没有假的残局,...
二分钟发现!多乐第三方辅助器,... 二分钟发现!多乐第三方辅助器,同城上饶棋牌确实有挂,存在挂教程(有挂机密);1、游戏颠覆性的策略玩法...
重大通报!宁波竞技馆有挂吗(透... 重大通报!宁波竞技馆有挂吗(透视辅助)外挂透视辅助app(2021已更新)(哔哩哔哩)1、打开软件启...
wepoke辅助技巧!poke... wepoke辅助技巧!pokenow其实是真的有挂,德州ai辅助神器黑科技1、超多福利:超高返利,海...
分享开挂内幕!天天开心王国十三... 分享开挂内幕!天天开心王国十三水有没有外 挂(辅助挂)一贯真的是有挂(2020已更新)(哔哩哔哩)1...
五分钟方法!全民牛牛怎么提升胜... 五分钟方法!全民牛牛怎么提升胜率,白金岛辅助工具(一直有挂)1、全民牛牛怎么提升胜率机器人多个强度级...
玩家必看教程!!钱塘十三水输赢... 玩家必看教程!!钱塘十三水输赢概率(透明挂)外挂透明挂辅助软件(2020已更新)(哔哩哔哩)钱塘十三...