1. 简介
用于TeamTalk通讯数据包的构造与解析
CImPdu结构为自定义header(包含len)+data(protobuf序列化后的消息)解决包的边界判断
该模块依赖于UtilPdu工具类,使用了protobuf第三方库
2. 常用接口说明
-
pdu header结构如下:
typedef struct { uint32_t length; // 整个包的长度 uint16_t version; // 通信协议的版本号 uint16_t flag; // not used uint16_t service_id; // 分组命令号,如login server和msg server属于不同分组 uint16_t command_id; // 分组内子命令,如登录请求和登录请求回复 uint16_t seq_num; // 包序号 uint16_t reversed; // 保留 } PduHeader_t; CSimpleBuffer m_buf; // 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。
3. Ubuntu 16.04 automake1.14编译安装指南
-
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
4. protobuf库编译安装指南
-
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编译安装指南
5. 生成.proto文件对应的c++代码
- 3rdParty/im_proto_files存放了TeamTalk所需.proto文件
- 执行3rdParty/im_proto_files/create.sh会在当前目录创建gen并生成相应c++代码
- 3rdParty/im_proto_files/sync.sh会将生成的c++代码复制到3rdParty/pb/protocol供其他模块使用
6. 源码
- 链接:TeamTalk_BlueBling/imPduBase
- 本项目主要为了学习teamtalk,尽量将每个细化模块独立出来并编写测试用例,方便移植。
- 测试demo: tests/test_impdubase.cpp