【发布时间】:2015-11-17 08:32:31
【问题描述】:
我在我的 c++ 服务器上使用 protobuf。但是我在一个套接字中有多个不同的 protobuf 消息有问题 我定义了很多proto消息,比如
message SdkHGetRet {
required int32 opcode = 1;
required bytes value = 2;
}
message SdkHPut {
required bytes table = 1;
required bytes hname = 2;
required bytes key = 3;
required bytes value = 4;
optional int32 writesrc = 5 [default = 0];
}
message SdkSet {
required bytes table = 1;
required bytes key = 2;
required bytes value = 3;
optional int32 writesrc = 4 [default = 0];
}
message SdkSetRet {
required bool status = 1;
optional string master = 2;
}
message SdkInvalidOperation {
required int32 what = 1;
required bytes why = 2;
}
....
所以每次通过socket发送消息时,我都会添加8个字节,4个为总socket len,4个为opcode,opcode表示消息类型。
所以在服务器端,我接收到消息,我读取了前 4 个字节,得到了消息的长度,然后我将读取另外 4 个字节来获取消息的类型,最后我读取了消息的长度字节。然后我将使用消息类型到方法映射(例如404 =>“sdkset”,405 =>“sdksetret”)来解码消息。
我发现这种方式效果很好,但我想知道是否有任何优雅的方式来识别没有 4 字节消息类型的消息。 我已经阅读了消息历史,一种方法是将整个消息添加到一个大消息中,就像这样
message BigMessage
{
enum Type { sdkset = 0, sdksetred = 1}
require Type t = 1,
optional string key = 2,
...
}
由于我有超过 40 种消息,我认为这种方式可能会影响性能,而且在我看来,这种方式看起来很丑。
那你能给我什么好的建议吗..
【问题讨论】: