繁体   English   中英

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

[英]Boost ASIO async call within handle functions

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

这里获取示例代码:

  // 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()相互调用。

我有两个问题:

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

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

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

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

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

可在此处找到有关Boost Asio协程的一些示例https://www.boost.org/doc/libs/1_69_0/doc/html/boost_asio/examples/cpp17_examples.html

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM