套接字中有多个不同的protobuf消息

时间:2015-08-24 01:54:46

标签: sockets protocol-buffers

我在我的c ++服务器上使用protobuf。但我在socket中有多个不同的protobuf消息有问题 我定义了许多原型消息,例如

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;
}
....

因此,每次我通过套接字发送消息时,我将添加8个字节,4个用于总套接字len,4个用于操作码,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种类型的消息,我认为这种方式可能会影响性能,在我看来,这种方式看起来很难看。

那么你能给我任何好的建议吗。

0 个答案:

没有答案