【发布时间】:2019-01-15 17:08:25
【问题描述】:
我正在通过自定义数据包实现客户端服务器通信。
我正在使用 Go net.conn。它可以拨打tcp/unix方案,非常方便。我使用protocol buffer 来定义我的消息。
我定义了一个包含length 和buffer 的数据包
type Packet struct {
length uint32
buffer []byte
}
API函数是这样的:func(api *API) Send(m *proto.Message) errorfunc(api *API) Receive(p *Packet) error
以send函数为例,它接受一个protobuf消息,将其编入Packet。并将其写入net.conn。
这里是发送功能的简化版本:
func(api *API) Send(m *proto.Message) error {
bytes, err := proto.Marshal(m)
if err != nil {
return err
}
buffer := api.packet[:length]
copy(buffer, bytes)
_, err := api.conn.Write(buffer)
if err != nil {
return err
}
return nil
}
我正在将bytes 复制到buffer。因为 Go 协议缓冲区 API 只提供了func Marshal(pb Message) ([]byte, error)
在协议缓冲区 C++ 中,它提供
bool SerializeToArray(void * data, int size) const,正在序列化消息并将其存储在给定的字节数组中。
但我在 Go 协议缓冲区 API 中找不到相同的东西。
如果我想直接将序列化结果存储在给定的字节数组中,有什么方法可以避免复制?
【问题讨论】:
-
能否请您澄清一些事情:为什么数据包存储在API的一个字段中,这个长度来自哪里?你真的只想写一个由长度(4 个字节)组成的字节数组,然后是连接的实际消息吗?
-
接受答案怎么样?
标签: go protocol-buffers ipc packet