用于TeamTalk通讯数据包的构造与解析
CImPdu结构为自定义头+protobuf序列化后的消息
该模块依赖于UtilPdu工具类,使用了protobuf第三方库
pdu header结构如下:
typedef struct {
uint32_t length; // the whole pdu length
uint16_t version; // pdu version number
uint16_t flag; // not used
uint16_t service_id; //
uint16_t command_id; //
uint16_t seq_num; // 包序号
uint16_t reversed; // 保留
} PduHeader_t;
CSimpleBuffer m_buf; //pdu原始数据(header+protobuf序列化后的消息体)
PduHeader_t m_pdu_header; //pdu消息头
bool IsPduAvailable(uchar_t* buf, uint32_t len, uint32_t& pdu_len)
对数据包头部4个字节即长度来校验buf是否完整
void Write(uchar_t* buf, uint32_t len)
通过buf构造CImPdu内部成员CSimpleBuffer m_buf
int ReadPduHeader(uchar_t* buf, uint32_t len)
从buf解析出包头数据,将buf字节数组转化成struct PduHeader_t,实际是构造CImPdu内部成员PduHeader_t m_pdu_header
CImPdu* ReadPdu(uchar_t *buf, uint32_t len)
读取pdu数据;
先校验pdu完整性(IsPduAvailable)再pPdu->Write(buf, pdu_len)保存完整pdu原始数据再ReadPduHeader解析出包头数据
void WriteHeader()
通过m_pdu_header结构体信息构造m_buf字节数组头部信息
void SetPBMsg(const google::protobuf::MessageLite* msg)
将msg序列化,内部使用了ProtoBufC数组的序列化APISerializeToArray;
SetPBMsg先m_buf.Read(NULL, m_buf.GetWriteOffset())清空m_buf再m_buf.Write(NULL, sizeof(PduHeader_t))预留出header空间,然后先设置包体(序列化后的msg),再设置Header。
automake 1.15卸载解决方案
apt-get install autoconf
使用上述指令ubuntu 16.04会默认安装automake 1.15
可以用下面指令卸载
apt-get --purge remove autoconf
通过源码包安装指南
依次下载
http://ftp.gnu.org/gnu/m4/m4-1.4.13.tar.gz
http://ftp.gnu.org/gnu/autoconf/autoconf-2.65.tar.gz
http://ftp.gnu.org/gnu/automake/automake-1.14.1.tar.gz
tar -zxvf xxx.tar.gz
cd xxx
./configure [–prefix]
make make install
查看安装情况
which autoconf
which automake
3rdParty/package_protobuf存放了protobuf-2.6.1.tar.gz源码包
执行3rdParty/make_protobuf.sh即可
最后会将生成的头文件和库文件拷贝到3rdParty/pb供其他模块使用
注意点: protobuf-2.6.1需依赖automake 1.14,解决方案参考上文ubuntu 16.04 automake1.14编译安装指南