C# – Can’t make same TCP message structure on C# client as it was on C++ client

I have a C++ server and I want to make Flatbuffers buffer with prepended 2 bytes of uint16_t header. I do that with no problems on C++ client. When I try to replicate the same logic in C# however it seems I am doing it wrong becase the dumps of the TCP packets shows different structure on same messages send with my C++ client and my C# client;

This is the command I use to dump the TCP messages I receive:

sudo ngrep -W byline -d any port 8085 -q

When I send a request from my C++ client to my C++ server here is the output the above command gives me:

T 127.0.0.1:44234 -> 127.0.0.1:8085 (AP) #4
..<.......................................test........test@abv.bg.

When I send from my C# client to my C++ server exactly the same message here is what the command dumps me:

T 192.168.68.100:58923 -> 192.168.68.107:8085 (AP) #9
...:..4...............................test........test@abv.bg.

Let me show you how I form the message on C++ and how I send it:

ClientOpcode opc = CLIENT_LOGIN_REQUEST;
flatbuffers::FlatBufferBuilder builder2;

auto email = builder2.CreateString("test@abv.bg");
auto password = builder2.CreateString("test");
auto clientHashStr = builder2.CreateString(clientHash);
auto loginRequest = Vibranium::CreateLoginRequest(builder2, email, password);
builder2.FinishSizePrefixed(loginRequest);
size_t size2 = builder2.GetSize();
uint8_t *buf2 = builder2.GetBufferPointer();

uint8_t *actualBuffer2 = new uint8_t(size2 + 2);
actualBuffer2(1) = (opc >> 8);
actualBuffer2(0) = (opc&0xFF);
memcpy(actualBuffer2 + 2, buf2, size2);

boost::asio::write(s, boost::asio::buffer(actualBuffer2,size2 + 2));

Here is how I form the message on C#:

Client authClient = GameObject.Find("Client").GetComponent<AuthClient>().client;
ClientOpcode clientOpcode = ClientOpcode.CLIENT_LOGIN_REQUEST;
var builder = new FlatBuffers.FlatBufferBuilder(1);
var email = builder.CreateString("test@abv.bg");
var password = builder.CreateString("test");
var loginRequest = LoginRequest.CreateLoginRequest(builder, email, password);
LoginRequest.FinishSizePrefixedLoginRequestBuffer(builder,loginRequest);

authClient.Send(builder, clientOpcode);

Here is my send function:

public static byte() PrependOpcode(byte() buffer, ClientOpcode opcode)
{
    byte() result = new byte(buffer.Length + 2);

    Buffer.BlockCopy(buffer, 0, result, 2, buffer.Length);

    byte() opcodeBytes = BitConverter.GetBytes((ushort) opcode);

    result(0) = opcodeBytes(0);
    result(1) = opcodeBytes(1);

    return result;
}


public void Send(FlatBufferBuilder builder, ClientOpcode opcode)
{
    byte() buffer = builder.SizedByteArray();
    byte() data = PrependOpcode(buffer, opcode);

    if (data.Length > MaxMessageSize)
    {
        Logger.LogError("Client.Send: message too big: " + data.Length + ". Limit: " + MaxMessageSize);
        return;
    }


    if (Connected)
    {
        // respect max message size to avoid allocation attacks.
        if (data.Length <= MaxMessageSize)
        {
            // add to send queue and return immediately.
            // calling Send here would be blocking (sometimes for long times
            // if other side lags or wire was disconnected)
            sendQueue.Enqueue(data);
            sendPending.Set(); // interrupt SendThread WaitOne()
        }
    }
    else
    {
        Logger.LogWarning("Client.Send: not connected!");
    }
}