C++编写的局域网tcp license认证服务

仓库路径

项目地址:license-server

0. 工程结构

项目包括以下主要模块和组件:

  • loghelper:简单的日志组件
  • json_message_processor:处理JSON消息的编码和解码
  • daemon:守护进程相关功能
  • conf:项目和消息的配置文件
  • license-client:以动态链接库方式提供的license客户端
  • license-server:基于boost.asio实现的license服务端,内部集成看门狗服务(相关代码已移除)

1. 消息格式

消息格式说明如下表所示:

消息长度(BYTES)结构描述
Header4SyncBytes同步字节,固定格式0x09, 0x6f, 0x01, 0x01,表示设备间交互
Header4FullMessageLength总消息长度,包括SyncBytes和FullMessageLength
Header4MessageSeq消息序列号,递增
Header4MessageType消息类型(消息号),如登录消息或发送消息
Header4StringBodyLength消息字符流长度,可以是JSON流、XML流或普通字符流
Header12Reserved保留字段,共12字节
BodyStringBodyLengthStringBody消息体,可以是JSON、XML或普通字符串数据
BodyFullMessageLength - 32 - StringBodyLengthBinaryData二进制数据,长度由FullMessageLength - 32 - StringBodyLength计算得出

2. license控制

  • license-server 默认配置maxLicenseNum,限制最大客户端连接数。
  • 每次客户端认证,maxLicenseNum减1,直至为0。
  • 客户端断开连接或停止服务,maxLicenseNum加1。

3. 网络库

  • 使用boost.asio实现的异步网络库。
  • license-client已隐藏boost依赖,供调用方使用。
  • 参考boost库示例实现,如 asio/example/cpp03/timeouts/server.cppasio/example/cpp03/chat/chat_client.cpp

4. License-Client

  • C++客户端模块以动态链接库方式提供。
  • 提供以下接口:
    void start(ClientConfig& cfg, MessageType_t& messageTypes, std::function<void(int)> cb);
    void stop();
    void sendHeartbeatReq();
    void sendLoginReq();
    void sendLogoutReq();
    void sendGetDogStatusReq();
    

5. License-Server

5.1 各模块关系

各模块关系图

  • 设计说明:
    • 使用PIMPL方式隐藏实现细节,减少对外接口暴露。
    • 每个tcpclient对应一个TcpServerSession对象,由SessionManager统一管理。
    • MessageHandler处理具体业务逻辑,JsonMessageProcessor专门处理JSON消息的编码和解码。
    • main函数负责加载配置和消息映射表,可以独立为一个模块。
5.2 消息触发流程

消息触发流程图

  • TcpClientImpl异步读取消息流程:
    • 当读取到32字节的消息头时,触发handlerReaderHeader,预处理完成后分发给注册的MessageHandler::onReadHeader处理。
    • 当读取到完整的TcpMessage后,触发handleReadBody,预处理完成后分发给onReadBody处理。
5.3 消息处理流程

消息处理流程图

  • 处理LoginReq消息流程:
    • 首先读取消息头,检查是否正确,继续执行。
    • 然后读取消息体,在readBody中分发消息到具体处理函数,在onLoginReq中调用dogService.getCurrentStatus
    • 最后,组装并通过TcpServerSessionwrite方法发送LoginRsp消息。

6. 心跳和保活

  • 双向心跳设计:
    • 客户端和服务端各自实现心跳机制,保证license及时释放。
    • 客户端有连接断开重连机制,可配置开启。

7. 守护进程设计

  • 设计要点:
    • 守护进程和工作进程需位于同一目录。
    • 仅支持单个工作进程,重复启动时先杀掉同名进程。
    • Linux平台需处理僵尸进程问题。
7.1 守护进程工作流程

守护进程工作流程图

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值