在其内部调用处理程序时调用Asio async_read

时间:2016-01-09 15:33:47

标签: c++ asynchronous boost-asio

我正在测试我的一些协议设计,并且无法使连续的async_read工作。我的想法是创建一个通用读取处理程序,输出接收到的数据(测试),然后检查它以执行协议定义的操作。

这意味着我从这个通用处理程序中调用一个新的async_read,由于某种原因,块和我的处理程序永远不会返回,阻止我的程序的进一步执行。

相关代码

void handle_read_server(const asio::error_code&error_code, size_t bytes_transferred, void *adress)
{
    // [...]
    char HELO[4] = {'H','E','L','O'};
    if (*received.data() == *HELO)
    {
        cout << "[Protocol] got HELO";
        got_helo = true;
        short code_data;
        asio::async_read(socket_server, asio::buffer(&code_data, 2), asio::transfer_all(), std::bind(handle_read_server, placeholders::_1, placeholders::_2, &code_data)); // This read is blocking my program to continue it's execution.
    }
}

我在问什么

导致此功能阻止的原因是什么?有没有什么可以让async_read线程一直运行将任何接收到的值传递给服务器中的流?

1 个答案:

答案 0 :(得分:2)

async_ *调用实际上并不阻止。

您有未定义的行为,方法是将本地变量的地址传递给异步操作/完成处理程序。

您必须确保缓冲区的生命周期延长至完成后。实现这一目标的自然方法是使缓冲区成为封闭类的成员。