예제 #1
0
size_t ProtobufSocketSerializer::serialize(
        const ::google::protobuf::Message &msg, char *&packet) {
    size_t size = PROTOBUF_HEADER_LENGTH + (size_t) msg.ByteSize();
    packet = new char[size]();

    ::google::protobuf::io::ArrayOutputStream aos(packet, (int) size);
    ::google::protobuf::io::CodedOutputStream coded_output(&aos);
    coded_output.WriteLittleEndian32((google::protobuf::uint32) msg.ByteSize());
    msg.SerializeToCodedStream(&coded_output);

    return size;
}
예제 #2
0
int Packet::Write(ClientService client) {
    if (null/*null packet*/)
        return 0;
    byte buf[6];
    google::protobuf::io::ArrayOutputStream raw_output(buf, 1024);
    google::protobuf::io::CodedOutputStream coded_output(&raw_output);
    coded_output.WriteRaw((void*)&ServiceId, 1);
    coded_output.WriteVarint32(MethodId);
    byte requestIdTemp[2];
    requestIdTemp[0] = (byte)(RequestId & 0xff);
    requestIdTemp[1] = (byte)(RequestId >> 8);
    coded_output.WriteRaw(requestIdTemp, 2);
    if (ServiceId != 0xfe) coded_output.WriteVarint64(Unknown);
    coded_output.WriteVarint32(PayloadLength);
    client.socket->Send(buf, coded_output.ByteCount());
    //DumpBuffer(buf, coded_output.ByteCount());
    if (PayloadLength > 0) {
        client.socket->Send(Payload, PayloadLength);
        //DumpBuffer(Payload, PayloadLength);
    }
    return 0;
}