在句柄函数中增强ASIO异步调用

时间:2019-01-09 00:34:27

标签: c++ asynchronous boost-asio

我仍在学习boost :: asio的工作原理,并希望澄清一些东西。

here中获取以下示例代码:

  // Read from client complete, now send data to remote server
  void handle_downstream_read(const boost::system::error_code& error,
                              const size_t& bytes_transferred)
  {
     if (!error)
     {
        async_write(upstream_socket_,
              boost::asio::buffer(downstream_data_,bytes_transferred),
              boost::bind(&bridge::handle_upstream_write,
                    shared_from_this(),
                    boost::asio::placeholders::error));
     }
     else
        close();
  }

  // Write to remote server complete, Async read from client
  void handle_upstream_write(const boost::system::error_code& error)
  {
     if (!error)
     {
        downstream_socket_.async_read_some(
             boost::asio::buffer(downstream_data_,max_data_length),
             boost::bind(&bridge::handle_downstream_read,
                  shared_from_this(),
                  boost::asio::placeholders::error,
                  boost::asio::placeholders::bytes_transferred));
     }
     else
        close();
}

这是tcp代理服务器的一部分,该服务器将传入的数据包转发到目标。下游读取是指从客户端读取,而上游写入是指写入主机。这两个句柄通过循环分别通过async_write()和async_read_some()相互调用。

我有2个问题:

首先,如果我更改handle_downstream_read(),以使async_write()改为write(),然后直接调用handle_upstream_write()函数,这将如何改变代码的执行?如果我正确理解它,则意味着handle_downstream_read()现在将阻止io_service而不是立即返回?但这是一个问题吗?这些东西不应该按顺序执行吗?

第二,假设上述更改是不好的,如果我想在调用handle_upstream_write()之前对handle_downstream_read()中的上游套接字的内容进行一些更改,该怎么办?我应该异步调用该修改函数,并让该函数调用async_write()吗?这样会将下一个读/写循环放入另一个“线程”吗?

谢谢,很抱歉提出这个问题。

1 个答案:

答案 0 :(得分:0)

我目前也在学习Boost Asio,如果我正确理解了问题的第一部分,我相信用async_write()代替write()并不是正确的方法,因为这会阻止整个线程(但是,我不确定。BoostAsio的专家可以确认这一点吗?)。

我认为您可能希望研究Boost Asio协程,因为它们允许您对诸如async_write()之类的异步函数进行排序。协程将阻止异步函数执行,直到该异步函数完成为止,但仅针对该特定连接-而非整个线程。

此处有https://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/examples/cpp17_examples.html

带有Boost Asio协程的一些示例。

很抱歉,如果我误解了您的问题,请记住,我是Boost Asio的初学者,所以我的回答可能是完全错误的。希望有更多经验的人可以更好地回答您的问题。