Boost asio, async_read error

Boost asio, async_read error

本文关键字:read error async asio Boost      更新时间:2023-10-16

这是我的代码:

    void do_read_header()
    {
        std::string incoming_header;
        boost::asio::async_read(socket_, boost::asio::buffer(incoming_header, incoming_header.length()), [this, incoming_header](boost::system::error_code ec, std::size_t)
        {
            if (!ec && check_message(incoming_header))
            {
                do_read_body();
            }
            //else
            //{
            //  socket_.close();
            //}
        });
    }
    void do_read_body()
    {
        std::string incoming_message;
        boost::asio::async_read(socket_, boost::asio::buffer(incoming_message, incoming_message.length()), [this, incoming_message](boost::system::error_code ec, std::size_t)
        {
            if (!ec)
            {
                std::cout.write(incoming_message.c_str(), incoming_message.length());
                std::cout << "n";
                //do_read_header();
            //}
            //else
            //{
                socket_.close();
            }
        });
    }

这是一个修改版本:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/chat/chat_client.cpp

我的代码出了什么问题?

一个问题是incoming_headerincoming_message是局部变量,在完成处理程序之前被销毁。你正在捕获它们的副本,而它们仍然是空的;然后操作将写入释放的内存,造成难以言喻的浩劫。

如果一次只需要读取一条消息,那么一种选择是使用成员变量而不是本地变量,并且只捕获this。或者,您可以动态分配缓冲区,记住在处理程序中删除它。

在任何情况下,请确保事先调整缓冲区的大小,或者使用boost::asio::streambuf读取任意数量的缓冲区。您正在用零大小初始化缓冲区,因此即使您没有破坏缓冲区,也永远不会得到任何数据。

相关文章: