Отправка двоичных сериализованных данных на основе stl на C ++ для передачи по сети с использованием сокетов: Пожалуйста, не используйте Boost, Protobuf или другие энтузиасты ПО.

Мне нужно отправить несколько сложных объектов по сети партнеру. Я написал код для их сериализации с помощью 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 приносят на стол, я просто хочу сделать это так, как я настроил код. Спасибо за понимание.

Спасибо, что прочитали мой длинный пост.

5
задан Sonny 14 October 2011 в 15:59
поделиться