Boost C++ Libraries/Boost.Asio

Boost.Asio 색인 - async_compose

까마귀75 2021. 1. 6. 12:27
728x90
반응형

async_compose

Stateful(서버에서 클라이언트의 동작 상태 정보를 저장하는 형태) 구현으로 비동기 작업을 시작한다.

template<
    typename CompletionToken,
    typename Signature,
    typename Implementation,
    typename... IoObjectsOrExecutors>
DEDUCED async_compose(
    Implementation && implementation,
    CompletionToken & token,
    IoObjectsOrExecutors &&... io_objects_or_executors);

[DEDUCED]

async_compose 함수는 적합한 중간 완료 핸들러로 stateful 함수 개체를 자동으로 래핑하는 합성된 비동기 작업의 구현을 단순화한다.

파라미터

implementation

합성된 비동기 작업의 구현을 포함하는 함수 개체이다. 함수 개체의 첫 번째 인수는 감싸고 있는 중간 핸들러에 대한 const가 아닌 참조이다. 나머지 인수는 구현에 의해 수행되는 비동기 작업의 완료 핸들러에서 발생하는 인수이다.

token

완료 토큰

io_objects_or_executors

아직 처리되지 않은 작업을 유지해야하는 0개 이상의 I/O 개체 또는 I/O 실행기(executor)

예제

struct async_echo_implementation
{
  tcp::socket& socket_;
  boost::asio::mutable_buffer buffer_;
  enum { starting, reading, writing } state_;

  template <typename Self>
  void operator()(Self& self,
      boost::system::error_code error = {},
      std::size_t n = 0)
  {
    switch (state_)
    {
    case starting:
      state_ = reading;
      socket_.async_read_some(
          buffer_, std::move(self));
      break;
    case reading:
      if (error)
      {
        self.complete(error, 0);
      }
      else
      {
        state_ = writing;
        boost::asio::async_write(socket_, buffer_,
            boost::asio::transfer_exactly(n),
            std::move(self));
      }
      break;
    case writing:
      self.complete(error, n);
      break;
    }
  }
};

template <typename CompletionToken>
auto async_echo(tcp::socket& socket,
    boost::asio::mutable_buffer buffer,
    CompletionToken&& token) ->
  typename boost::asio::async_result<
    typename std::decay<CompletionToken>::type,
      void(boost::system::error_code, std::size_t)>::return_type
{
  return boost::asio::async_compose<CompletionToken,
    void(boost::system::error_code, std::size_t)>(
      async_echo_implementation{socket, buffer,
        async_echo_implementation::starting},
      token, socket);
}

요구사항

일반 헤더: boost/asio/compose.hpp
편의 헤더: boost/asio.hpp

Boost.Asio 홈

728x90
반응형