boost :: asio :: async_read不会回调我的处理函数

时间:2017-01-08 13:40:11

标签: c++ boost boost-asio asyncsocket

我正在与boost::asio合作,以便客户与客户之间进行TCP通信。服务器应用程序都是我写的。我最初使用boost::asio::read进行同步数据读取。 sync_read工作正常,但我无法在读取操作期间执行socket.cancel。这已成为一个相当大的限制因素。因此我现在尝试将我的同步读取转换为async_read机制

以下是我的同步读取机制,非常好。我做2次读。首先获取数据包标题,然后获取效果非常好的数据包数据 - >

size_t Read_Data_Sync(std::vector<unsigned char> & msg_body) {
  //fetch the header
  MyMessageHeader msg_header;
  boost::system::error_code err_code;
  size_t bytes_received = boost::asio::read(socket, boost::asio::buffer(&msg_header, sizeof(msg_header)), err_code);

  if (bytes_received <= 0 || err_code)
    return 0;

  err_code.clear();
  msg_body.resize(msg_header.size);

  //fetch the body
  bytes_received = boost::asio::read(socket, boost::asio::buffer(msg_body), err_code);
  if (bytes_received <= 0 || error_code)
    return 0;

  return bytes_received;
}

以上函数用于从客户端thread连续调用,我将其称为读者线程 like so - &gt;

auto data_reader_thread = std::thread {[this] {
    while(run_thread) {
        Read_Data_Sync();
    }
}};

以下是我如何更改此内容以制作阅读机制async - &gt;

读者线程保持不变,除了它现在调用另一个我编码的读取函数以async方式读取数据

auto data_reader_thread = std::thread {[this] {
    while(run_thread) {
        Read_Data_Async();
    }
}};

我做了msg_body&amp; msg_header作为我班级的成员变量。更新的逻辑是从线程函数连续调用Read_Data_AsyncRead_Data_Async调用boost::asio::async_read绑定 Handle_Read_Header的地址作为回调,而后者又会boost::asio::async_read读取邮件正文,传递处理程序回调以接收message_body

void Read_Data_Async() 
{
    //firstly read message header
    MyMessageHeader msg_header;
    boost::asio::async_read(socket, boost::asio::buffer(&msg_header, sizeof(msg_header)), boost::bind(&TCPSession::Handle_Read_Header, this,
                                                                                                             boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}

void Handle_Read_Header(const boost::system::error_code & error, std::size_t bytes_transferred)
{
    //now read the message body
    if (!error && bytes_transferred > 0) {
        boost::asio::async_read(socket, boost::asio::buffer(msg_body), boost::bind(&TCPSession::Handle_Read_Body, this,
                                                                                                                 boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
    }
    else {
        cout << "Error: " << error << "\n";
    }
}


void Handle_Read_Body(const boost::system::error_code & error, std::size_t bytes_transferred)
{
    if (!error && bytes_transferred > 0) {
        // msg_body has the data read from socket
    }
    else if (error != boost::asio::error::eof) {
        cout << "Error: " << error << "\n";
    }
}

我现在面临的问题是回调Handle_Read_Header永远不会被回调!! 我的工作有什么问题?我查看了很多相关帖子,例如this one试图解决我的问题 问题但是该链接再次建议拨打io.run,因为其约为boost::asio::async_read_until而不是boost::asio::async_read

我的上述逻辑是否正确boost::asio::async_read?我应该asio回调我的处理函数?

1 个答案:

答案 0 :(得分:1)

你必须在某处运行io_service::run()¹

实际上,执行异步IO的整个想法是你 NOT 需要单独的线程进行读/写:完全双工完全可以在一个线程上完成。

使用run_one,poll或poll_one

进行一些更复杂的循环