服务器用protobuffer (之后简称pb)做协议包体使用了两个月, 确实体验到了很多方便的地方(接口代码易写易维护, 内部编码高效,传输快等)
但不可否认的是C++在使用它的时候存在一些很难发现的坑。
c++ pb包体序列化/反序列化的方法有三种,分别是(从输入流, 文件流, 和string)中序列化
对于网络传输的话, 用到只可能是string序列化/反序列化
也就是在正常网络编程中用到的接口函数如下:
string code= getStringFromClient();
ProtoTest::OnGame rcvBody;
rcvBody.ParseFromString(code);
......
ProtoTest::OnGame rspBody;
string codeBody;
rspBody.SerializeToString(&codeBody);
SendStringToClient(codeBody);
自己游戏正在用的服务器是基于已有框架搭建的
每一个messageID通过函数指针对应一个回调函数
所以收发数据的接口必须按如下如下格式:
int32_t process_request_playgame(CMessage& message, const char* body, const int32_t length)
int32_t send_response_to_client(const char* body, int16_t nLength, int16_t nMessageID, int32_t iSequence)
所以在收数据的时候必须把c风格字符串(body包体)赋值为string再反序列化
发数据的时候把序列化后的string赋值给C字符串(.c_str()) 再发送
第一个坑调了一天多, 还耽误了