Мне нужно отправить несколько сложных объектов по сети партнеру. Я написал код для их сериализации с помощью ostream и оператора << для каждого члена класса в объектах, которые необходимо сериализовать. Написанный мной код успешно работает для сериализации и сетевой отправки (htonl (), htons () и т. Д. Используются правильно - я проверил вышеупомянутое, записав в ofstream (локальный файл) в двоичном формате (std :: ios :: bin Моя следующая задача - запись этих двоичных данных через сетевой сокет - вот где у меня возникли проблемы.
У меня есть класс Socket, который переводит объекты std :: string в строки в стиле C перед их отправкой через сокет следующим образом:
int Socket::send (const std::string goodies) const
{
status = ::send (socket, goodies.c_str(), goodies.size(), 0);
return status;
}
тот же класс Socket, который я использую в приемнике, использует recv () для помещения входящего сообщения в std :: string перед его передачей в приложение десериализации:
int Socket::recv (std::string& goodies)
{
char buf [1024];
goodies = "";
memset (buf, 0, 1025);
int status = ::recv (socket, buf, 1024, 0);
if (status < 0)
{
return -1;
}
else if (status == 0)
{
return 0;
}
else
{
goodies = buf;
return status;
}
}
Я выполняю отправку, используя следующий код :
ostringstream os (std::ios::binary);
GiantObject giantComplexObjectWithWholeLoadOfOtherObjects;
// Initialize and set up
// giantComplexObjectWithWholeLoadOfOtherObjects.
// The following call works well--I tested it by writing to ofstream locally (file)
// and checked it out using a hex dump.
// Now, of course, my intent is to send it over the network, so I write to
// ostream&:
giantComplexObjectWithWholeLoadOfOtherObjects.serialize (os);
std::string someStr = os.str(); // Get me the stream in std::string format
mySocket.send(someStr); // Does not work--send sent correctly, but recv received 0 bytes
Однако, если я попробую:
std::string someStr ("Some silly string");
mySocket.send (someStr); // received by receiver (receiver is similar arch).
Таким образом, что-то не так с моим вызовом для отправки двоичного std :: string в сокет. Любая помощь приветствуется. Еще раз, я не хочу использовать Boost, protobuf и т. д.
PS: Я потратил много времени, просматривая старые сообщения здесь, и первый ответ на эти типы вопросов r eceive - использовать Boost.Пожалуйста - есть и другие способы, не связанные с Boost и Protobuf, и я хочу понять эти другие способы. Я действительно ценю то, что Boost и Protobuf приносят на стол, я просто хочу сделать это так, как я настроил код. Спасибо за понимание.
Спасибо, что прочитали мой длинный пост.