프로그래밍/의문

FlatBuffer streaming 통신

제페 2019. 8. 11. 04:28
반응형

원했던 동작

별도의 패킷 헤더를 붙이지 않고 FlatBuffer 바이너리만 송신한다.

 

사전 작업

FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE를 정의한다.(#define FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE) (Verifier의 GetComputedSize를 사용하기 위해)

 

방법

1. flatbuffer::Verifier를 이용하면 패킷이 완성되었는지 체크한다.

2. flatbuffer::Verifier::GetComputedSize()를 사용해 메세지 사이즈 만큼 읽기 인덱스를 뒤로 넘긴다.

 

샘플 코드

FlatBufferBuilder builder;
auto serializedPacket =
    CreatePacket(
        builder,
        PacketBase::LoginReq,
        CreateLoginReq(builder, builder.CreateString("test")).Union());
builder.Finish(serializedPacket);

// 여기부터 수신 측이라 가정
std::vector<uint8_t> streambuf{ builder.GetBufferPointer(), builder.GetBufferPointer() + builder.GetSize() };
size_t streambufIdx = 0;

Verifier verifier{ builder.GetBufferPointer(), builder.GetSize() };

if (VerifyPacketBuffer(verifier))
{
    const LoginReq* packet = GetPacket(builder.GetBufferPointer())->payload_as_LoginReq();
    size_t messageSize = verifier.GetComputedSize();
    streambufIdx += messageSize;
}

 

 

반응형