Request 和 Response 两个类,都有记录序列号的 seq_id 字段,但 Notice 没有。Protocol 类就是认真把一段 buffer 字节数组,转换成 Message 的子类工具。以是必要针对三种 Message 的子范例都实现对应的 Encode() / Decode() 要领。
- class Protocol {
-
- public:
- virtual ~Protocol() {
- }
-
- /**
- * @brief 把哀求动静编码成二进制数据
- * 编码,把msg编码到buf内里,返回写入了多长的数据,假如高出了 len,则返回-1暗示错误。
- * 假如返回 0 ,暗示不必要编码,框架会直接从 msg 的缓冲区读取数据发送。
- * @param buf 方针数据缓冲区
- * @param offset 方针偏移量
- * @param len 方针数据长度
- * @param msg 输入动静工具
- * @return 编码完成所用的字节数,假如 < 0 暗示堕落
- */
- virtual int Encode(char* buf, int offset, int len, const Request& msg) = 0;
-
- /**
- * 编码,把msg编码到buf内里,返回写入了多长的数据,假如高出了 len,则返回-1暗示错误。
- * 假如返回 0 ,暗示不必要编码,框架会直接从 msg 的缓冲区读取数据发送。
- * @param buf 方针数据缓冲区
- * @param offset 方针偏移量
- * @param len 方针数据长度
- * @param msg 输入动静工具
- * @return 编码完成所用的字节数,假如 < 0 暗示堕落
- */
- virtual int Encode(char* buf, int offset, int len, const Response& msg) = 0;
-
- /**
- * 编码,把msg编码到buf内里,返回写入了多长的数据,假如高出了 len,则返回-1暗示错误。
- * 假如返回 0 ,暗示不必要编码,框架会直接从 msg 的缓冲区读取数据发送。
- * @param buf 方针数据缓冲区
- * @param offset 方针偏移量
- * @param len 方针数据长度
- * @param msg 输入动静工具
- * @return 编码完成所用的字节数,假如 < 0 暗示堕落
- */
- virtual int Encode(char* buf, int offset, int len, const Notice& msg) = 0;
-
- /**
- * 开始编码,会返回即将解码出来的动静范例,以便行使者结构吻合的工具。
- * 现实操纵是在举办“分包”操纵。
- * @param buf 输入缓冲区
- * @param offset 输入偏移量
- * @param len 缓冲区长度
- * @param msg_type 输出参数,暗示下一个动静的范例,只在返回值 > 0 的环境下有用,不然都是 TypeError
- * @return 假如返回0暗示分包未完成,必要继承分包。假如返回-1暗示协议包头理会堕落。其他返回值暗示这个动静包占用的长度。
- */
- virtual int DecodeBegin(const char* buf, int offset, int len,
- MessageType* msg_type) = 0;
-
- /**
- * 解码,把之前DecodeBegin()的buf数据解码成详细动静工具。
- * @param request 输出参数,解码工具会写入此指针
- * @return 返回0暗示乐成,-1暗示失败。
- */
- virtual int Decode(Request* request) = 0;
-
- /**
- * 解码,把之前DecodeBegin()的buf数据解码成详细动静工具。
- * @param request 输出参数,解码工具会写入此指针
- * @return 返回0暗示乐成,-1暗示失败。
- */
- virtual int Decode(Response* response) = 0;
-
- /**
- * 解码,把之前DecodeBegin()的buf数据解码成详细动静工具。
- * @param request 输出参数,解码工具会写入此指针
- * @return 返回0暗示乐成,-1暗示失败。
- */
- virtual int Decode(Notice* notice) = 0;protected:
-
- Protocol() {
- }
-
- };
这里有一点必要留意,因为 C++ 没有内存垃圾汇集和反射的手段,在表明数据的时辰,并不能一步就把一个 char[] 转换成某个子类工具,而必需分成两步处理赏罚。
先通过 DecodeBegin() 来返回,将要解码的数据是属于哪个子范例的。同时完因素包的事变,通过返回值来奉告挪用者,是否已经完备的收到一个包。
挪用对应范例为参数的 Decode() 来详细把数据写入对应的输出变量。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|