C++ Flatbuffers如何发送一条消息uint16\u t头、大小\u t正文大小和uint8\u t缓冲区
我在用, 我想按以下顺序形成一条消息:C++ Flatbuffers如何发送一条消息uint16\u t头、大小\u t正文大小和uint8\u t缓冲区,c++,boost-asio,flatbuffers,C++,Boost Asio,Flatbuffers,我在用, 我想按以下顺序形成一条消息: uint16_t头标识符。(固定大小消息) 大小与体型你不需要1)和2)。要获得1),请在架构中声明一个文件\u标识符,然后将该标识符传递给Finish。要获得一个2)字符,请使用FinishSizePrefixed。所有这些都在你仍然不想阅读的文档中 再说一次,这是一种二进制格式,所以我不确定你在用std::to_string做什么,但它不起作用。您只需要编写buf的内容。我不知道如何在Boost中使用它。而且我知道我可以像这样设置文件标识符auto a
文件\u标识符
,然后将该标识符传递给Finish
。要获得一个2)字符,请使用FinishSizePrefixed
。所有这些都在你仍然不想阅读的文档中
再说一次,这是一种二进制格式,所以我不确定你在用
std::to_string
做什么,但它不起作用。您只需要编写buf
的内容。我不知道如何在Boost中使用它。而且我知道我可以像这样设置文件标识符auto accountRole=Vibranium::CreateAccountRole\u Packet(builder,1,name);const char*HEADER=“ABCD”;FinishSizePrefixed(accountRole,HEADER)
但是,我如何首先检查索引器,以便知道以哪种格式解码?是否有获取缓冲区标识符的一般方法?我发现,一旦我使用flatc生成了类似于*AccountRole\u PacketIdentifier()
的函数,但这仅适用于该表。如果我有很多,服务器应该使用它们的标识符来知道确切的类型,那该怎么办?你在浪费时间,你必须在尝试直接进入“平面缓冲区”之前学习,我打赌在理解asio之后,你会发现你不需要平面缓冲区…@JeanDavy为什么?Boost Asio是一个在另一端提供网络解决方案的库,FlatBuffers为消息的序列化/反序列化提供了方便的方式。为什么Boost Asio会使扁平缓冲变得不必要?“Boost Asio为什么……”这正是你必须学习Asio的原因!
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)));