【分析总结框架记录】对通信数据包进行打包

在章节6  我们实现了利用protbuffer进行数据传送。在实际传送过程中,我们往往还需要对数据添加一些额外的信息,以便接收方能正确处理该数据包。

对此,可采用一些符合自定义要求的结构。这里就以如下结构作为代表:


其中msgId代表该协议对应的消息Id, bodyLength表明body占用长度, serialNo对应请求序列号,sessionId,对应回话Id, from 表明来原, body表明真正携带的数据


注意:该结构只针对服务器之间的通信,对于服务器与客户端之间的通信需要在重新设计。


新增包结构类:PacketHead.h

  1. #ifndef __PACKET_HEAD_H__  
  2. #define __PACKET_HEAD_H__  
  3.   
  4. #include <string.h>  
  5.   
  6. class PacketHead  
  7. {  
  8. public:  
  9.     typedef int8_t int8;  
  10.     typedef int16_t int16;  
  11.     typedef int32_t int32;  
  12.     typedef int64_t int64;  
  13.   
  14.     typedef uint8_t uint8;  
  15.     typedef uint16_t uint16;  
  16.     typedef uint32_t uint32;  
  17.     typedef uint64_t uint64;  
  18.   
  19.     PacketHead(uint16 msgId = 0, uint16 bodyLength = 0, uint32 serialNo=0,  
  20.         uint32 sessionId = 0, uint16 from = 0)  
  21.         : _msgId(msgId)  
  22.         , _bodyLength(bodyLength)  
  23.         , _serialNo(serialNo)  
  24.         , _sessionId(sessionId)  
  25.         , _from(from){}  
  26.     ~PacketHead(){}  
  27.   
  28.     inline void DecodeHead(const char* buffer)  
  29.     {  
  30.         int offset = 0;  
  31.         memcpy(&_msgId, buffer, sizeof(_msgId));  
  32.         offset += sizeof(_msgId);  
  33.   
  34.         memcpy(&_bodyLength, buffer + offset, sizeof(_bodyLength));  
  35.         offset += sizeof(_bodyLength);  
  36.   
  37.         memcpy(&_serialNo, buffer + offset, sizeof(_serialNo));  
  38.         offset += sizeof(_serialNo);  
  39.   
  40.         memcpy(&_sessionId, buffer + offset, sizeof(_sessionId));  
  41.         offset += sizeof(_sessionId);  
  42.   
  43.         memcpy(&_from, buffer + offset, sizeof(_from));  
  44.     }  
  45.   
  46.     inline void EncodeHead(char* buffer)  
  47.     {  
  48.         int offset = 0;  
  49.         memcpy(buffer, &_msgId, sizeof(_msgId));  
  50.         offset += sizeof(_msgId);  
  51.   
  52.         memcpy(buffer + offset, &_bodyLength, sizeof(_bodyLength));  
  53.         offset += sizeof(_bodyLength);  
  54.   
  55.         memcpy(buffer + offset, &_serialNo, sizeof(_serialNo));  
  56.         offset += sizeof(_serialNo);  
  57.   
  58.         memcpy(buffer + offset, &_sessionId, sizeof(_sessionId));  
  59.         offset += sizeof(_sessionId);  
  60.   
  61.         memcpy(buffer + offset, &_from, sizeof(_from));  
  62.     }  
  63.       
  64.     enum{HeaderLength = 14};  
  65.     uint16 _msgId;  
  66.     uint16 _bodyLength;  
  67.     uint32 _serialNo;  
  68.     uint32 _sessionId;  
  69.     uint16 _from;  
  70. };  
  71.   
  72. #endif  

其中DecodeHead负责解包, EncodeHead负责打包。


同样对于Push而言 需要在发送数据之间进行打包工作,在Pull而言在接受到数据之后进行解包工作。

对于Push一段 需要在Protobuffer序列化之前进行如下操作:

  1. PushZmq* push = new PushZmq(url.c_str());  
  2. //string sendContent = "Hello Pull.I am From Push!";  
  3. PbMsgHello helloMsg;  
  4. helloMsg.set_helloint(123456);  
  5. helloMsg.set_hellostring("ni hao wang peng ");  
  6.   
  7. int length = helloMsg.ByteSize();  
  8. char* buffer = (char*)malloc(length + PacketHead::HeaderLength);  
  9.   
  10. // 加头  
  11. PacketHead packetHead(1,length,2,3,4);  
  12. packetHead.EncodeHead(buffer);  
  13.   
  14. helloMsg.SerializeToArray(buffer + PacketHead::HeaderLength, length);  
  15.   
  16. push->Send(buffer, length + PacketHead::HeaderLength);  
  17. free(buffer);  

对于Pull而言,在接受到的地方进行解包:

  1. LOG(INFO) << "TestOnMessage:";  
  2.   
  3. // 解包  
  4. PacketHead packetHead;  
  5. packetHead.DecodeHead(buffer);  
  6. LOG(INFO) << " msgId = " << packetHead._msgId  
  7.     << " bodylength = " << packetHead._bodyLength  
  8.     << " serialNo = " << packetHead._serialNo  
  9.     <<" sessionId = " << packetHead._sessionId  
  10.     << " from = " << packetHead._from;  
  11.   
  12. PbMsgHello helloMsg;  
  13. helloMsg.ParseFromArray(buffer + PacketHead::HeaderLength, packetHead._bodyLength);  
  14. LOG(INFO) << " helloInt = " << helloMsg.helloint()  
  15.     << " helloString = " << helloMsg.hellostring();  


重新编译运行

Pushl端:



Pull端:



在Pull端可以看到 在Push端之前打包的信息msgId bodyLength等均已解析出来。


打包 解包完毕。 对应源码:http://download.csdn.net/detail/jcracker/6270973

下一步应该加入framework来处理接受到的消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值