исключение при использовании boost::serialization с boost::asio

мой сервер запускает следующий код:

boost::asio::streambuf streambuf;
std::istream istream(&streambuf);
boost::archive::xml_iarchive xml_iarchive(istream);
boost::asio::read_until(socket_, streambuf, '\n');

Когда сервер запущен и работает, я подключаюсь через telnet с другой машины. Сразу после установления соединения соединение закрывается, и сервер падает со следующим исключением:

terminate called after throwing an instance of 'boost::archive::xml_archive_exception'
    what():  unrecognized XML syntax

Где сбой в приведенном выше фрагменте кода? Мне кажется, что сеанс telnet отправляет '\n' до того, как я вручную ввожу некоторую строку XML.


person user1587451    schedule 06.03.2013    source источник
comment
какая строка выдает исключение?   -  person Sam Miller    schedule 06.03.2013
comment
boost::archive::xml_iarchive xml_iarchive(istream);   -  person user1587451    schedule 06.03.2013


Ответы (1)


Вы не опубликовали sscce, поэтому я создал его для вас

#include <boost/asio.hpp>
#include <boost/archive/xml_iarchive.hpp>

int
main()
{
    try {
        boost::asio::streambuf streambuf;
        std::istream istream(&streambuf);
        boost::archive::xml_iarchive xml_iarchive(istream);
    } catch ( const std::exception& e ) {
        std::cerr << e.what() << std::endl;
    }
}

Как и ожидалось, исключение выбрасывается из строки 10:

samm$ ./a.out
unrecognized XML syntax

Это не имеет ничего общего с Boost.Asio, вы пытаетесь десериализовать пустой буфер, который не является допустимым XML. Чтобы решить эту проблему, отложите десериализацию до завершения чтения из сокета в буфер.

boost::asio::read_until(socket_, streambuf, '\n');
std::istream istream(&streambuf);
boost::archive::xml_iarchive xml_iarchive(istream);
person Sam Miller    schedule 06.03.2013