Увеличить ASIO асинхронный вызов - PullRequest
0 голосов
/ 09 января 2019

Я все еще изучаю, как работает 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 ()? Это поместило бы следующий цикл чтения / записи в другой «поток»?

Спасибо, извините за многословный вопрос.

1 Ответ

0 голосов
/ 09 января 2019

Я также в настоящее время изучаю Boost Asio, и если я правильно понял первую часть вашего вопроса, я считаю, что замена async_write() на 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, поэтому мой ответ может быть совершенно неверным. Надеюсь, кто-то с большим опытом может ответить на ваш вопрос лучше.

...