[英]C++ - Unable to get prefixed uint16_t header
以下是我如何使用 FlatBuffers 形成我的消息以及我如何通过 Boost ASIO 发送它。
enum ServerOpcode : uint16_t{
SMSG_AUTH_CONNECTION_RESPONSE = 0x001,
SMSG_LOGIN_REQUEST = 0x002,
SMSG_LOGIN_REQUEST_RESPONSE_TEST = 0xA99,
};
ServerOpcode opc;
opc = ServerOpcode::SMSG_LOGIN_REQUEST_RESPONSE_TEST;
flatbuffers::FlatBufferBuilder builder;
auto email = builder.CreateString("test@abv.bg");
auto password = builder.CreateString("passHerepassHerepassHerepassHereZzpa");
auto loginRequest = Vibranium::CreateLoginRequest(builder,email,password);
builder.FinishSizePrefixed(loginRequest);
size_t size = builder.GetSize();
uint8_t *buf = builder.GetBufferPointer();
uint8_t *actualBuffer = new uint8_t[size + 2];
actualBuffer[1] = (opc >> 8);
actualBuffer[0] = (opc&0xFF);
memcpy(actualBuffer + 2, buf, size);
boost::asio::write(s, boost::asio::buffer(actualBuffer,size + 2));
所以我基本上想要实现的是在 flatbuffers 消息前面添加一个 uint16_t 标头。
这是我使用的结构。
class Packet {
public:
Packet()
{
}
static const int header_size = 2;
static const int body_size_in_bytes = 4;
std::vector<std::byte> header_buffer;
std::vector<std::byte> size_buffer;
uint16_t headerCode{0};
uint32_t body_size{0};
std::vector<std::byte> body_buffer;
void PreparePacket(ServerOpcode serverOpcode, std::string message);
};
这是我尝试在服务器端读取标头的方法:
void Vibranium::Client::read_header() {
auto self(shared_from_this());
_packet.header_buffer.resize(_packet.header_size);
boost::asio::async_read(socket,
boost::asio::buffer(_packet.header_buffer.data(), _packet.header_size),
[this, self](boost::system::error_code ec,std::size_t bytes_transferred)
{
if ((boost::asio::error::eof == ec) || (boost::asio::error::connection_reset == ec))
{
Disconnect();
}
else
{
std::memcpy(&_packet.header_buffer, &_packet.header_buffer[0], sizeof (_packet.headerCode));
std::cout << "Header Code: " << _packet.headerCode << std::endl;
//read_size();
}
});
}
不幸的是,这给了我以下输出:
Header Code: 0
为什么以及如何正确获得前置的 2 字节标头? 我的错误在哪里,我该如何解决?
您的“复制步骤”中存在错误,您正在从源复制到目标。 (编译器实际上可能会通知您这一点)。
如果您将 memcpy 更改为std::memcpy(&_packet.headerCode, &_packet.header_buffer[0], sizeof (_packet.headerCode));
,它应该开始工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.