一种二进制通信协议
消息 | 长度(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)。
协议代码编写
#include <string>
#include <vector>
#define kTotalHeadLen 32
struct TcpMessage_t
{
int syncBytes = 0;
int fullMsgLen = 0;
int msgSeq = 0;
int msgType = 0;
int bodyLen = 0;
char reserved[12] = {0}; // reserved 12-bytes
std::string body;
std::string binaryData; // maybe empty
};
void sendMsg(TcpMessage_t &data)
{
TcpMessage_t msg;
int _currentSeq;
msg.syncBytes = 1;
_currentSeq += 1;
msg.msgSeq = _currentSeq;
msg.msgType =1;
msg.bodyLen = data.body.length();
msg.fullMsgLen = kTotalHeadLen + msg.bodyLen + data.binaryData.length();
//send msg
}