代码拉取完成,页面将自动刷新
基于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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。