# enet
**Repository Path**: Camelot-23/enet
## Basic Information
- **Project Name**: enet
- **Description**: Reactor高并发网络服务器
- **Primary Language**: Unknown
- **License**: BSD-3-Clause-Clear
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2024-04-12
- **Last Updated**: 2024-04-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Cpp, cmake
## README
# Reactor Project
基于Reactor模式的Linux C++网络服务端,支持多线程TCP服务器,单线程TCP服务器
**机器配置**
> manjaro kde(vmware虚拟机环境)
> 2核心4线程 4GB内存 一个网卡
> 测试程序每次发送120字节数据,然后接收服务端回复,循环1W次
**性能测试**
| 服务端线程数 | 客户端连接 | QPS |
|--------|-------|---------|
| 1主1从 | 10连接 | 2000/s |
| 1主2从 | 10连接 | 4000/s |
| 1主4从 | 20连接 | 9756/s |
| 1主8从 | 20连接 | 2.1W/s |
| 1主10从 | 20连接 | 4.65W/s |
### 介绍
**基于epoll的IO Event**
IO事件设置为非阻塞,由epoll进行管理,使用边缘触发模式。
至少需要一个EventLoop,为主事件循环,用于监听、通信。
如果添加了多个EventLoop,其余的为从事件循环,处理客户端的通信事件,主事件循环只处理连接事件。
**粘包/分包处理**
固定前四字节为消息的长度大小。使用Buffer,当收到一条完整的消息后才回调给上层处理。
**消息回复**
如果处理消息时间较长,可以添加工作线程,处理完成后,通过eventfd唤醒事件循环回复消息,以避免阻塞从事件循环。
**超时处理**
使用timerfd定时器,定期对超时的客户端连接进行清理。
**程序退出**
通过信号退出程序,清理所有线程。
**核心类**
| 类名 | 作用 | |
|-----------|--------------------------------------------------------------------------------------------------------|:--|
| Epoll | 管理epoll的创建、添加、删除、等待事件 | |
| EventLoop | 对Epoll的封装
主事件循环回调Acceptor
从事件循环回调Connector
被eventfd唤醒后执行任务队列的任务,被timerfd唤醒后,清理过期的Connector | |
| Acceptor | 处理客户端连接事件 | |
| Connector | 处理客户端通信事件 | |
| TcpServer | 管理类,管理主从事件循环,以及Acceptor和所有的Connector | |
### 使用说明
**编译**
cd 项目根目录
cmake -B build -S .
cmake --build build
**运行**
cd /build/src/net
./server 127.0.0.1 5555 4 4
./test 127.0.0.1 5555
---
> 2024/04/29 --elot