Boost C++ Libraries/Boost.Asio

Boost.Asio 개요 - 핵심 개념 및 기능 - Boost.Asio 기본 구조

까마귀75 2020. 12. 5. 23:22
728x90
반응형

Boost.Asio 기본 구조 (Basic Boost.Asio Anatomy)

Boost.Asio는 소켓과 같은 I/O 개체에 대해 동기식과 비동기식 작업을 모두 수행할 수 있다. Boost.Asio를 사용하기 전에, 프로그램 내에서 Boost.Asio의 다양한 부분들이 함께 작동하는 방식에 대한 개념적 그림을 보는 것이 유용할 수 있다.

 

입문 예제로 소켓에서 연결 작업을 수행할 때 어떤 일이 발생하는지 살펴본다. 동기식 작업을 살펴보는 것부터 시작할 것이다.

 

동기식 작업

 

프로그램에는 boost::asio::io_context 개체, boost::asio::thread_pool 개체 또는 boost::asio::system_context와 같은 I/O 실행 컨텍스트가 적어도 하나 있다. 이런 I/O 실행 컨텍스트는 운영 체제의 I/O 서비스에 대한 프로그램의 링크를 나타낸다.

boost::asio::io_context io_context;

프로그램에서 I/O 작업을 수행하려면 TCP 소켓 같은 I/O 개체가 필요하다.

boost::asio::ip::tcp::socket socket(io_context);

 

동기식 연결 작업이 진행되면, 다음과 같은 순서로 이벤트가 발생한다:

 

  1. 프로그램에서 I/O 개체를 호출하여 연결 작업을 시작한다:
    socket.connect(server_endpoint);
  2. I/O 개체는 요청을 I/O 실행 컨텍스트에 전달한다.
  3. I/O 실행 컨텍스트는 연결 작업을 수행하기 위해 운영 체제를 호출한다.
  4. 운영 체제는 I/O 실행 컨텍스트로 작업 결과를 반환한다.
  5. I/O 실행 컨텍스트는 작업에서 발생한 모든 오류를 boost::system::error_code 유형의 개체로 변환한다. error_code는 특정 값과 비교되거나 부울로 테스트될 수 있다(false 결과는 오류가 발생하지 않았음을 의미). 결과는 I/O 개체로 다시 전달된다.
  6. 작업이 실패한 경우, I/O 개체는 boost::system::system_error 예외를 발생한다. 작업을 시작하는 코드가 다음과 같이 작성된 경우:
    boost::system::error_code ec;
    socket.connect(server_endpoint, ec);

    그러면 error_code 변수 ec에 작업 결과가 설정되고, 예외가 발생하지 않을 것이다.

비동기식 작업을 사용하면, 동기식과 다른 순서로 이벤트가 발생한다.

 

(1) 비동기식 작업

  1. 프로그램이 I/O 개체를 호출하여 연결 작업을 시작한다:
    socket.async_connect(server_endpoint, your_completion_handler);

    여기서 your_completion_handler는 서명이 있는 함수나 함수 개체이다.
    void your_completion_handler(const boost::system::error_code& ec);

    요구되는 정확한 서명은 수행되는 비동기 작업에 따라 다르다. 참조 문서는 각 작업에 대한 적합한 형식을 나타낸다.
  2. I/O 개체는 요청을 I/O 실행 컨텍스트에 전달한다.
  3. I/O 실행 컨텍스트는 운영 체제에 비동기 연결을 시작해야 한다는 시그널을 보낸다.

    시간이 흐른다. (동기식 작업의 경우 이 대기 시간은 연결 작업 중에 포함되었을 것이다.)

(2) 비동기식 작업

  1. I/O 실행 컨텍스트에서 선택할 준비가 된 큐에 결과를 배치하여 연결 작업이 완료되었음을 운영 체제는 나타낸다.
  2. io_contextI/O 실행 컨텍스트로 사용하는 경우, 프로그램은 결과를 검색하기 위해 io_context::run() (또는 유사한 io_context 멤버 함수 중 하나)을 호출해야 한다. io_context::run() 호출은 완료되지 않은 비동기 작업이 있는 동안 블록 되므로 일반적으로 첫 번째 비동기 작업을 시작하면 바로 호출해야 한다.
  3. io_context::run()를 호출하는 동안 내부에서는, I/O 실행 컨텍스트가 작업 결과를 큐에서 빼서 error_code로 변환하고, 그리고 완료 핸들러로 전달한다.

 

이것이 Boost.Asio가 작동하는 간략한 그림이다. 다른 유형의 비동기 작업을 수행하도록 Boost.Asio를 확장하는 등 고급 요구 사항의 경우 문서를 자세히 살펴봐야 한다.

 

 

핵심 개념 및 기능  Boost.Asio 개요   Boost.Asio 홈

728x90
반응형