1.首先进入pbdef/netmessage.prqto定义:
ex:
messageEchoProto
{
required string data = 1;
}
2.调用gibbon下的pbgen.sh生成pb文件
文件是在pb文件夹下面。
3.cd protocol目录,实现定义协议字段。
Ex:
public:
EchoProto proto; //暂时不太清楚是什么意思
std::string_marshal_data;
public:
enum
{
PROTOCOL_ID= PROTOCOL_ID_ECHO,//要记得修改
};
Echo(){}
~Echo(){}
virtualconst std::string& Marshal() //这一部分不用修改
{
//1. 设置协议具体子段
//2. 给协议wrap一层,添加protocolid
CProtocproto;
cproto.set_id(PROTOCOL_ID);
cproto.set_body(proto.SerializeAsString());
std::stringdata;
cproto.SerializeToString(&data);
//3. 封包
NetPacketpacket;
packet.header= 0xF0;
packet.tail= 0x0F;
packet.type= 1;
packet.datalen= data.size();
_marshal_data= PacketData(packet, data.c_str());
return_marshal_data;
}
virtualvoid UnMarshal(const char* buf, int length)
{
proto.ParseFromString(std::string(buf,length));
}
//clone函数记得要修改一下
virtual Protocol* Clone()
{
return new Echo();
}
4.cd include 在protocolid.h中enum加上PROTOCOL_ID_ECHO
//neum是什么数据类型?uchar?
5.在需要用到协议的模块目录下面加上.hpp文件并在main里面加上hpp
在class里面的process是处理收到内容后的代码。
Ex:
#ifndef _ECHO_H
#define _ECHO_H
#include <string>
#include "protocol.h"
#include "protocolid.h"
#include "net_base.h"
#include "packet_sync.h"
#include "pb/netmessage.pb.h"
#include "tcpserver.h"
class Echo: public Protocol
{
#include "protocol/echo"
virtual void Process(const char* buf, intlength, void* userdata)
{
UnMarshal(buf, length);
LOG_TRACE("Echo|data=%s",proto.data().c_str());
}
};
#endif // end _ECHO_H
6.实现prosess部分。