问题描述
我正在使用FlatBuffers和Boost ASIO
我要按以下顺序形成一条消息:
- uint16_t标头标识符。 (固定大小的消息)
- size_t正文大小
- Flatbuffers对象。 (动态尺寸消息,其大小为2)
因此,对于前两个,我将结合使用它们进行发送:
size_t const header_length = 8;
size_t const body_size_b = 8;
ServerOpcode opc;
opc = ServerOpcode::SMSG_LOGIN_REQUEST_RESPONSE_TEST;
std::string header = std::to_string(opc);
flatbuffers::FlatBufferBuilder builder;
auto name = builder.CreateString("Orc MONSTER");
auto accountRole = Vibranium::CreateAccountRole_Packet(builder,1,name);
builder.Finish(accountRole);
size_t size = builder.GetSize();
uint8_t *buf = builder.GetBufferPointer();
std::array<char,header_length + body_size_b> buffer{};
std::copy(header.begin(),header.end(),buffer.begin());
std::copy(std::to_string(size).begin(),std::to_string(size).end(),buffer.begin() + header_length);
// How can I add builder here at third place ?
boost::asio::write(s,boost::asio::buffer(buffer,sizeof(buffer)));
我不知道如何在前两个之后追加flatbuffers缓冲区。
我的问题是:
我如何依次统一所有三个并将它们发送到boost::asio::write
中?
解决方法
您不需要1)和2)。要获得1),请在您的架构中声明一个file_identifier
,然后将该标识符传递给Finish
。要获得2),请使用FinishSizePrefixed
。所有这些都在您仍然不想阅读的文档中。
同样,这是一种二进制格式,所以我不确定您对std::to_string
所做的事情,但是它不起作用。您只需要编写buf
的内容。我不知道如何在Boost中使用它。