Я все еще изучаю, как работает 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 () в цикле.
У меня есть 2 вопроса:
Во-первых, если я изменю handle_downstream_read () так, чтобы вместо async_write () вместо write () следовал прямой вызов функции handle_upstream_write (), как это изменит исполнение кода? Если я правильно понимаю, это означает, что handle_downstream_read () теперь будет блокировать io_service вместо мгновенного возврата? Но это проблема? Разве эти вещи не должны выполняться последовательно в любом случае?
Во-вторых, если вышеупомянутое изменение плохо, что мне делать, если я хочу внести некоторые изменения в содержимое в upstream_socket_ в handle_downstream_read () перед вызовом handle_upstream_write ()? Должен ли я вызывать эту функцию модификации асинхронно и вызывать эту функцию async_write ()? Это поместило бы следующий цикл чтения / записи в другой «поток»?
Спасибо, извините за многословный вопрос.