[英]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.