【发布时间】:2021-07-16 14:20:43
【问题描述】:
采取以下措施:
struct Header{
std::size_t body_size;
};
struct Body{
std::string data;
};
struct Packet{
Header header;
Body body;
};
现在假设我想通过tcp 套接字发送Packet 对象。
为此,我想将标头序列化为std::string,其中包含有关body 大小的信息,并通过套接字发送string。
但是这个序列化的标头字符串本身具有可变大小,因为body_size 不固定,所以我怎么知道要读取多少字节(序列化标头字符串)
那么在发送这样的数据时使用了什么样的协议呢?
【问题讨论】:
-
对于简单的数据,您可以序列化为 JSON,或使用像 CBOR 这样的二进制格式,或者如果您准备迎接挑战,请使用 Google Protocol Buffers 定义您自己的数据格式
-
使您的协议的每一帧都采用
[size data]的形式。首先读取大小,然后读取数据包的其余部分。这可能不是最好的方法,但它可以在面向流的套接字中工作。 -
您是否有理由希望将标头作为字符串发送? TCP 是一个字节流,所以你可以直接发送
size_t。