Flatbuffers如何发送一条消息uint16_t标头,size_t主体大小和uint8_t缓冲区

问题描述

我正在使用FlatBuffersBoost ASIO

我要按以下顺序形成一条消息:

  1. uint16_t标头标识符。 (固定大小的消息)
  2. size_t正文大小
  3. 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中使用它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...