接着上篇博文,在上篇博文当中我们一起简要的分析了下tbnet库中的transport类,该类是整个开源库的总起,接下来,我们就来分析下tbnet库中所使用的一些传输数据包的封装,在tbnet中对于传输包定义的比较开放,如果自己想要借用tbnet库时,可以通过继承tbnet库的packet类来定义自己的包结构,一个传输数据包一般的结构分为两个部分:1)包头;2)包体,而包头主要提供了一些包的基本信息以及路由信息,而包体则是包含用户传输的数据,在tbnet库中,首先定义了一个包头结构,代码如下:
class PacketHeader {
public:
uint32_t _chid; // ͨµÀID
int _pcode; // Êý¾Ý°üÀàÐÍ
int _dataLen; // Êý¾Ý°übody³¤¶È(³ýÍ·ÐÅÏ¢Íâ)
};
在该结构中,包含了三部分内容:channelID、数据包的编码以及包体的长度,在使用tbnet库中,所有的数据包都会定义包头,接下来看看packet的部分定义,代码如下
class Packet {
friend class PacketQueue;
public:
...
/*
* ×é×°
*
* @param output: Ä¿±êbuffer
* @return ÊÇ·ñ³É¹¦
*/
virtual bool encode(DataBuffer *output) = 0;
/*
* ½â¿ª
*
* @param input: Ô´buffer
* @param header: Êý¾Ý°üheader
* @return ÊÇ·ñ³É¹¦
*/
virtual bool decode(DataBuffer *input, PacketHeader *header) = 0;
...
protected:
PacketHeader _packetHeader; // Êý¾Ý°üµÄÍ·ÐÅÏ¢
int64_t _expireTime; // µ½ÆÚʱ¼ä
Channel *_channel;
Packet *_next; // ÓÃÔÚpacketqueueÁ´±í
};
在packet类中,我们主需要关注一下其中的两个函数即可,encode函数和decode函数,每个数据包在传输之前都需要经过二进制编码的过程,而在收到数据包时吗,又需要二进制解码过程,所以在packet类中,定义了这两个函数,并且这两