如何保持增强asio异步读取持续活动

Ken*_*Ken 5 c++ boost asynchronous

我正在构建一个必须发送请求和读取响应的tcp客户端,但也必须能够检测来自tcp服务器的不是对请求的响应的传入数据 - 服务器可以发起tx/rx序列.

什么是始终保持异步读取活动的最佳方法.我尝试了以下方法:

在我的"handle_connect"方法中,我启动了异步读取和异步写入.异步读取如下所示:


    size_t bytes_transferred = BUFFER_SIZE;
    boost::asio::async_read(m_socket,
        boost::asio::buffer(rcvbuf, bytes_transferred),
        boost::bind(&CClientSock::handle_read, 
        this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));

异步写入填充缓冲区然后开始写入:


    boost::asio::async_write(m_socket,
        boost::asio::buffer(sndbuf, request_length),
        boost::bind(&CClientSock::handle_write, 
        this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));

在异步写入处理程序中 - 由于异步读取已经启动,因此它什么都不做.

这不起作用.应该从服务器对客户端写入的响应中读取的数据永远不会触发异步读取处理程序.我实际上并不确定写入会执行......

可以这样做,因为读取和写入不按正常顺序排队吗?我是否必须开始读取,然后取消它,如果我需要开始写入?

seh*_*ehe 5

在没有明确的 SSCCE/样本的情况下,我将强调一些想法:

  • 要接受“未经请求的”传入数据/请求,您通常使用侦听器来接受新的传入连接,而不是在同一连接上无限期地等待数据
  • 如果您需要在同一资源上对不同的异步任务进行排序,请使用 Boost Asio strand为什么在使用 boost::asio 时每个连接都需要链?
  • 为了继续阅读,在基于 Actor 的异步中,只需从前一个读取操作的完成处理程序中发布读取操作:

     void handle_read(boost::system::error_code ec, size_t bytes_received) {
         if (!ec)
         {
    
             /* do your usual handling on the incoming data */
    
    
             boost::asio::async_read(m_socket,
                boost::asio::buffer(rcvbuf, bytes_transferred),
                boost::bind(&CClientSock::handle_read, 
                this,
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));
         }
    
     }
    
    Run Code Online (Sandbox Code Playgroud)