java 包头结构_包头结构

这篇博客详细介绍了Java中网络通信协议的包头结构,包括请求和响应的格式。包头包含了请求标记、协议版本、消息长度、序列号、命令等关键信息。同时,提供了包头的结构定义以及数据完整性验证的方法`CheckProtoReq`和`CheckProtoRsp`,用于检查接收到的数据是否完整和正确。
摘要由CSDN通过智能技术生成

// 协议都是网络字节序

/**

请求格式

1 1 2 4 4 4 Len

+---+---+-------+---------------+---------------+---------------+------------------+

| Q | V | VER | Len | SEQ | CMD | Msg |

+---+---+-------+---------------+---------------+---------------+------------------+

*/

typedef struct {

uint8_t QV[2]; // 请求标记

uint16_t ver; // 协议版本

uint32_t len; // msg长度 + sizeof(uint32_t), 主机序

uint32_t seq; // seq标记, 请求和响应会一致

uint32_t cmd; // 请求的命令

uint32_t msglen; // msg长度

uint8_t msg[0]; // 请求的消息

void SetLen(int l) { len = htonl(l + sizeof(uint32_t)); msglen = htonl(l); };

void SetSeq(int s) { seq = htonl(s); };

void SetCmd(int c) { cmd = htonl(c); };

int GetSeq() { return ntohl(seq); };

int GetCmd() { return ntohl(cmd); };

int GetLen() { return ntohl(len) - sizeof(uint32_t); };

int GetPkgLen() { return ntohl(msglen); };

} __attribute__((packed)) ProtoReq;

/**

响应格式

1 1 2 4 4 4 4 8 Len

+---+---+-------+---------+---------+---------+--------+---------+-----------------+

| Q | A | VER | Len | SEQ | CMD | Errno | 保留 | Msg |

+---+---+-------+---------+---------+---------+--------+---------+-----------------+

*/

typedef struct {

uint8_t QA[2]; // 响应标记

uint16_t ver; // 协议版本

uint32_t len; // 返回数据的长度; msglen + 4

uint32_t seq; // 请求时传入的seq

uint32_t cmd; // 请求时传入的cmd

int32_t err; // 设置的返回值;

uint64_t mark; // 保留字段

uint32_t msglen; // 消息长度,

uint8_t msg[0]; // 返回的消息体

void Build(const ProtoReq &req)

{

QA[0] = 'Q', QA[1] = 'A';

ver = req.ver;

seq = req.seq;

cmd = req.cmd;

err = 0;

mark = 0;

}

void SetLen(int l) { len = htonl(l + sizeof(uint32_t)); msglen = htonl(l); };

int GetLen() { return ntohl(len) - sizeof(uint32_t); };

void SetErr(int e) { err = htonl(e); };

int GetErr() { return ntohl(err); };

int GetSeq() { return ntohl(seq); };

int GetPkgLen() { return ntohl(msglen); };

} __attribute__((packed)) ProtoRsp;

// 验证请求正确性

// > 0 返回正数表示数据已经接收完整且该值表示数据包的长度,

// = 0 表示数据包还未接收完整,

// < 0 表示出错

static inline int CheckProtoReq(const char *data, size_t len)

{

ProtoReq *req = (ProtoReq *)data;

if (len < sizeof(ProtoReq))

return 0;

if (req->QV[0] != 'Q' || req->QV[1] != 'V')

return -1;

uint32_t total = req->GetLen() + sizeof(ProtoReq);

return len < total ? 0 : total;

}

static inline int CheckProtoRsp(const char *data, size_t len)

{

ProtoRsp *req = (ProtoRsp *)data;

if (len < sizeof(ProtoRsp))

return 0;

if (req->QA[0] != 'Q' || req->QA[1] != 'A')

return -1;

uint32_t total = req->GetLen() + sizeof(ProtoRsp);

return len < total ? 0 : total;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值