# xncc_server **Repository Path**: lxncc/xncc_server ## Basic Information - **Project Name**: xncc_server - **Description**: 一个服务端平台程序。IO线程和业务线程通过配置文件组合。 线程间通信使用无锁环形队列。通知机制使用eventfd,定时器使用timerfd. 使用最小堆。 参考了muduo的部分实现 - **Primary Language**: C++ - **License**: BSD-2-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-14 - **Last Updated**: 2025-05-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xncc_server #### 介绍 一个服务端平台程序。IO线程和业务线程通过配置文件组合。 线程间通信使用无锁环形队列。通知机制使用eventfd,定时器使用timerfd. 使用最小堆。 参考了muduo的部分实现 #### 软件架构 软件架构说明 1. 通过配置文件来组合消息流向和初始化线程数量 2. 线程分业务线程和IPC线程,IPC线程只负责收发消息 3. 业务线程间通信,通过无锁队列实现 4. IPC线程产生消息后发送给业务线程,不负责body的解码操作 5. 支持配置多个IPC线程,客户端和服务端自定义 6. 全部通过消息触发,用户需要自己注册业务线程的回调 7. 单个引擎的业务处理和定时消息,全部是单线程 #### 安装教程 1. sh build.sh #### 使用说明 1. 编译器gcc 支持C++11 2. 系统支持epoll 支持eventfd 3. 执行build.sh脚本即可编译examples和平台代码库 4. 平台启动必须提供配置文件 conf.json 含义如下 5. 或者提供配置信息的json字符串 6. 用户继承EventEngine类 使用和实现对应的接口 ``` { //PlatformLog 可不配置 不配置则使用默认数据 "PlatformLog": { "LogPath": "../log", //[Y] 平台库日志文件路径 "LogName": "myplat", //[Y] 日志名称前缀 日志名称为 stdout 则输出到控制台 "LogLevel": 5, //[Y] 日志级别 FATAL = 1,ERROR = 2, WARN = 3,INFO = 4, DEBUG = 5, "CoreId": 3, //[N] 日志线程绑核id 默认值 -1 -1不绑核 "RotateSize": 512 //[N] 单个日志文件最大大小 单位 M 默认512 }, "Queues": [ { "Id": 5, //[Y] 消息队列ID "Size": 1024, //[Y] 消息队列默认大小 "AutoExpand": false //[Y] 消息队列是否自动扩容 }, { "Id": 1, "Size": 1024, "AutoExpand": true }, { "Id": 4, "Size": 1024, "AutoExpand": true } ], "BusinessThreads": [ //业务线程配置 { "Id": 10, //[Y] 业务线程ID "Name": "ServerReceiver", //[Y] 业务线程自定义名称 "Sub": [ 5 //[N] 业务线程订阅的消息队列 集合 可不订阅 ], "Pub": [ //[N] 元素可为空 不发布数据 { "QueueId": 1, //[Y] 业务线程发出的消息 进入到消息队列ID "MsgCodes": [ 1000 //[Y] 业务线程发出的消息 进入到消息队列ID 以及消息ID ] } ], "CoreId": -1, //[N] 线程绑核id 默认值 -1 -1不绑核 "IOMultiMode": 1 //[N] 线程事件驱动模型 默认值 1 0 死循环 1 epoll 2 poll 3 select }, { "Id": 2, "Name": "Receiver2", "Sub": [ 1 ], "Pub": [], "CoreId": -1, "IOMultiMode": 1 //[N] 线程事件驱动模型 默认值 1 0 死循环 1 epoll 2 poll 3 select }, ], "ServerThreads": [//server线程配置 { "Id": 3, //[Y] IPC线程ID "Name": "StreamServer", //[Y] IPC线程自定义名称 "PubId": 5, //[Y] IPC线程收到的消息 发送给哪个消息队列ID "Addr": "tcp@0.0.0.0:9000", //[Y] IPC线程的地址 服务端模式就是监听端口 客户端模式就是要连接的服务端地址 "CoreId": -1 //[N] 线程绑核id 默认值 -1 -1不绑核 "IOMultiMode": 1 //[N] 线程事件驱动模型 默认值 1 1 epoll 2 poll 3 select "SubServerThreads":[ //[N] 子服务 主服务分配连接给子服务 { "Id" : 5, //[Y] 子服务ID "Name": "SubServer", //[Y] 线程自定义名称 "PubId": 6, //[Y] IPC线程收到的消息 发送给哪个消息队列ID "CoreId": -1 //[N] 线程绑核id 默认值 -1 -1不绑核 "IOMultiMode": 1 //[N] 线程事件驱动模型 默认值 1 1 epoll 2 poll 3 select } ] }, ], "ClientThreads": [//Client线程配置 { "Id": 4, "Name": "StreamClient", "PubId": 4, "Addr": "tcp@127.0.0.1:9000", //[Y] unix-domain-scoket 配置为 uds@path udp通信 udp@127.0.0.1:9000 tcp通信 tcp@127.0.0.1:9000 共享内存通信shm@path "ReConnIntervalMs": 5000, //[N] 重连时间间隔 毫秒 不配置 则不重连 "CoreId": -1, //[N] 线程绑核id 默认值 -1 -1不绑核 "IOMultiMode": 1 //[N] 线程事件驱动模型 默认值 1 1 epoll 2 poll 3 select } ] } ``` #### 参与贡献