1

我的服务器运行以下代码:

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

当服务器启动并运行时,我从另一台机器连接 vie telnet。建立连接后,连接立即关闭,服务器崩溃,但出现以下异常:

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

上面代码片段的失败在哪里?在我手动输入一些 XML 字符串之前,我认为 telnet 会话正在发送一个“\n”。

4

1 回答 1

4

您没有发布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);
于 2013-03-06T17:03:40.110 回答