我仍在学习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()吗?这样会将下一个读/写循环放入另一个“线程”吗?
谢谢,很抱歉提出这个问题。
答案 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的初学者,所以我的回答可能是完全错误的。希望有更多经验的人可以更好地回答您的问题。