基于boost.asio的tcp 局域网认证服务
消息格式为:
消息 | 长度(BYTES) | 结构 | 描述 |
---|---|---|---|
Header | 4 | SyncBytes | 格式:0x09, 0x6f, 0x01, 0x01,表示不同设备之间的交互 |
Header | 4 | FullMessageLength | 数据总长度,包括SyncBytes和FullMessageLength |
Header | 4 | MessageSeq | 消息序列 seq ,递增 |
Header | 4 | MeaageType | 消息类型(消息号),如登录消息或发送消息消息 |
Header | 4 | StringBody | 消息字符流长度,可能是json流、xml流以及普通字符流 |
Header | 12 | Reserved | 保留字段,总共12字节 |
Body | StringBodyLength | StringBody | 消息体( json或xml或普通字符串数据),该字段长度可能为0 |
Body | FullMessageLength - 32 - StringBodyLength | BinaryData | 二进制数据,该字段长度可能为0 |
注: 消息头总共32个字节(包括SyncBytes和FullMessageLength),消息体长度StringBodyLength是已知的,而二进制数据长度计算得到(FullMessageLength - 32 - StringBodyLength)。
license-server和 license-client底层均使用boost.asio的异步方式。
license-client已做隐藏,调用方可以不依赖于boost库。
参考asio/example/cpp03/timeouts/server.cpp实现tcpserver
tcpclient实现参考path_to_boost/libs/asio/example/cpp03/chat/chat_client.cpp和path_to_boost/libs/asio/example/cpp03/timeouts/async_tcp_client.cpp
C++客户端模块最终以动态链接库方式提供。
license-client提供给外部动态链接库,接口有:
// 开始认证服务 // cfg - 客户端的配置 // messageTypes - 消息映射表,必须和server保持一致 // cb - 看门狗状态的回调函数 void start(ClientConfig& cfg, MessageType_t& messageTypes, std::function<void(int)> cb); // 停止认证服务 void stop(); void sendHeartbeatReq(); void sendLoginReq(); void sendLogoutReq(); void sendGetDogStatusReq();
如图为各模块关系,简要说明:
为了减少对外暴露接口,使用PIMPL方式对外隐藏实现;
每个tcpclient对应一个TcpServerSession对象,通过SessionManager集中管理;
将具体业务转移到MessageHandler中处理,JsonMessageProcessor专门用于json消息的encode和decode;
main函数包含了程序配置加载和消息表映射读取,这部分也可以抽成单独模块。
如图在TcpClientImpl中async_read消息:
当读到32字节消息头时,触发handlerReaderHeader,在消息预处理完成后,分发给注册的MessageHandler::onReadHeader处理;
当读到完整的TcpMessage后,触发handleReadBoay,预处理完成后,分发给onReadBody处理。
如图,收到LoginReq消息后的处理流程:
几个限制条件:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。