1

私のサーバーは次のコードを実行します:

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

上記のコード スニペットのどこでエラーが発生していますか? 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 に答える