Как отправить / получить структуру в boost :: asio

289
13 ноября 2017, 21:31

Я собирался отправить структуру с клиента на сервер, используя boost :: asio :: async_write_some, в этом случае boost :: serialization приходит на помощь:

    //boost::serialization
struct blank
{
    int m_id;
    std::string m_message;
    template<typename archive>
    void serialize(archive& ar, const short version)
    {
        ar & m_id;
        ar & m_message;
    }
};
blank info;
info.m_id = 1;
info.m_name = "Rasul";
std::stringstream ss;
boost::archive::binary_oarchive out_archive(ss);
out_archive << info;

Kак я могу отправить / получить out_archive, используя boost :: asio асинхронно? Если у вас есть другие идеи?

Answer 1

У std::stringstream, в который вы сериализуете свою структуру, есть метод str, позволяющий получить содержимое потока в виде строки, её уже можно преобразовать в бинарный буфер при помощи asio::buffer, который можно отправлять асинхронно. Только нужно помнить, что буфер на самом деле хранит ссылку на исходную строку, и нужно не допустить её удаления раньше времени.

С точки зрения производительности это не оптимальный подход, т.к. содержимое потока копируется в строку, но boost::serialisation в любом случае не славится производительностью. Можно попытаться немного оптимизировать и влезть во внутренность потока при помощи rdbuf, но тут уже нужно разбираться с внутренним устройством стандартных потоков. Проще взять другую библиотеку сериализации без использования потоков - в конечном счете вам нужно получить просто массив байт.

READ ALSO
Чтение текста из файла

Чтение текста из файла

Не могу никак дойти до разумного решения данной проблемы, пытался использовать ifstream, fopen

239
С++ Как получить вывод и возвращаемое значение команды batch

С++ Как получить вывод и возвращаемое значение команды batch

С помощью system можно получить возвращаемое значениеТакже, команду можно открыть как файл

217
Разница между define и const [дубликат]

Разница между define и const [дубликат]

На данный вопрос уже ответили:

270
Как преобразовать аргумент из std::string в LPCWSTR

Как преобразовать аргумент из std::string в LPCWSTR

Кусок кода для проверки интернет соединения:

802