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);
}