Мне нужно отправить несколько сложных объектов по сети на одноранговый узел. Я написал код для их сериализации, используя ostream и оператор << для каждого члена класса в объектах, которые должны быть сериализованы. Код, который я написал, успешно работает для сериализации и сетевой отправки (htonl (), htons () и т. Д. Правильно используется - я проверил вышеупомянутое, записав в ofstream (локальный файл) в двоичном формате (std :: ios :: bin) Моя следующая задача - записать эти двоичные данные через сетевой сокет - вот где у меня проблемы. </p>
У меня есть класс 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: я потратил значительное количество времени на просмотр старых постов здесь, и первый ответ, который получат эти типы вопросов, - это использование Boost. Пожалуйста - есть другие не-Boost, не-Protobuf способы, и я хочу понять эти другие способы. Я ценю то, что Boost и Protobuf привносят в таблицу, я просто хочу сделать это так, как я настроил код. Спасибо за ваше понимание.
Спасибо, что прочитали мой длинный пост.