【问题标题】:Boost asio, async_read errorBoost asio,async_read 错误
【发布时间】:2013-12-21 08:22:43
【问题描述】:

这是我的代码:

    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_header 必须是char*...
  • 在执行速度方面最快的方法是将字符串转换为 char*

标签: c++ boost


【解决方案1】:

一个问题是incoming_headerincoming_message 是局部变量,在完成处理程序之前被销毁。当它们仍然为空时,您正在捕获它们的副本;然后该操作将覆盖已释放的内存,造成无法估量的破坏。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多