Protobuf ParseFromArray с ошибкой вложенного сообщения

Я экспериментирую с клиентом / сервером с использованием protobuf и Winsock2. Клиентская сторона принимает данные "person", сериализует их в массив и отправляет их с помощью winsock. Серверная сторона получает данные и анализирует их.

Просто отправка человека, а не отправка человека в качестве суб-сообщения адресной книги работает нормально. Когда я пытаюсь добавить пользователя в качестве вложенного сообщения адресной книги, ParseFromArray() начинает давать сбой. Это работает, когда я устанавливаю person.name = "Test", но затем происходит сбой, если я устанавливаю person.name = "Daniel". Я в недоумении. Любые советы помогут!

syntax = "proto3";

package addressbook;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  Person person = 1;
}
main.cpp

// WORKING EXAMPLE
addressbook::Person person;
person.set_name("test");
person.set_email("testash@gmail.com");
addressbook::AddressBook book;
*(book.mutable_person()) = person;
client->Send(book);

// BROKEN EXAMPLE
addressbook::Person person;
person.set_name("Daniel");
person.set_email("testash@gmail.com");
addressbook::AddressBook book;
*(book.mutable_person()) = person;
client->Send(book);
client.cpp

Client::Send()
{
   size_t addressbookSize = addressbook.ByteSizeLong();
   void* dataArray = std::malloc(addressbookSize);
   addressbook.SerializeToArray(dataArray, addressbookSize));

   char* data = static_cast<char*>(dataArray);
   send(mServer, data, sizeof(data), 0);
}
server.cpp

Server::Receive()
{
   do {
      bytesReceived = recv(client_socket, buffer, sizeof(buffer), 0);

      addressbook::AddressBook book;
      book.ParseFromArray(buffer, bytesReceived))
      memset(buffer, 0, sizeof(buffer));
   } while (bytesReceived > 0);
}

0 ответов

Другие вопросы по тегам