提升asio,async_read错误

时间:2013-12-04 17:46:45

标签: c++ boost

这是我的代码:

    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

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

一个问题是incoming_headerincoming_message是局部变量,在完成处理程序之前被销毁。你正在捕捉它们的副本,而它们仍然是空的;然后该操作将写入释放的内存,造成无法形容的破坏。

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

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