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);
동기식 연결 작업이 진행되면, 다음과 같은 순서로 이벤트가 발생한다:
- 프로그램에서 I/O 개체를 호출하여 연결 작업을 시작한다:
socket.connect(server_endpoint);
- I/O 개체는 요청을 I/O 실행 컨텍스트에 전달한다.
- I/O 실행 컨텍스트는 연결 작업을 수행하기 위해 운영 체제를 호출한다.
- 운영 체제는 I/O 실행 컨텍스트로 작업 결과를 반환한다.
- I/O 실행 컨텍스트는 작업에서 발생한 모든 오류를 boost::system::error_code 유형의 개체로 변환한다. error_code는 특정 값과 비교되거나 부울로 테스트될 수 있다(false 결과는 오류가 발생하지 않았음을 의미). 결과는 I/O 개체로 다시 전달된다.
- 작업이 실패한 경우, I/O 개체는 boost::system::system_error 예외를 발생한다. 작업을 시작하는 코드가 다음과 같이 작성된 경우:
boost::system::error_code ec; socket.connect(server_endpoint, ec);
그러면 error_code 변수 ec에 작업 결과가 설정되고, 예외가 발생하지 않을 것이다.
비동기식 작업을 사용하면, 동기식과 다른 순서로 이벤트가 발생한다.
- 프로그램이 I/O 개체를 호출하여 연결 작업을 시작한다:
socket.async_connect(server_endpoint, your_completion_handler);
여기서 your_completion_handler는 서명이 있는 함수나 함수 개체이다.
void your_completion_handler(const boost::system::error_code& ec);
요구되는 정확한 서명은 수행되는 비동기 작업에 따라 다르다. 참조 문서는 각 작업에 대한 적합한 형식을 나타낸다. - I/O 개체는 요청을 I/O 실행 컨텍스트에 전달한다.
- I/O 실행 컨텍스트는 운영 체제에 비동기 연결을 시작해야 한다는 시그널을 보낸다.
시간이 흐른다. (동기식 작업의 경우 이 대기 시간은 연결 작업 중에 포함되었을 것이다.)
- I/O 실행 컨텍스트에서 선택할 준비가 된 큐에 결과를 배치하여 연결 작업이 완료되었음을 운영 체제는 나타낸다.
- io_context를 I/O 실행 컨텍스트로 사용하는 경우, 프로그램은 결과를 검색하기 위해 io_context::run() (또는 유사한 io_context 멤버 함수 중 하나)을 호출해야 한다. io_context::run() 호출은 완료되지 않은 비동기 작업이 있는 동안 블록 되므로 일반적으로 첫 번째 비동기 작업을 시작하면 바로 호출해야 한다.
- io_context::run()를 호출하는 동안 내부에서는, I/O 실행 컨텍스트가 작업 결과를 큐에서 빼서 error_code로 변환하고, 그리고 완료 핸들러로 전달한다.
이것이 Boost.Asio가 작동하는 간략한 그림이다. 다른 유형의 비동기 작업을 수행하도록 Boost.Asio를 확장하는 등 고급 요구 사항의 경우 문서를 자세히 살펴봐야 한다.
728x90
반응형
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 개요 - 핵심 개념 및 기능 - 스레드와 Boost.Asio (0) | 2020.12.07 |
---|---|
Boost.Asio 개요 - 핵심 개념 및 기능 - Proactor 디자인 패턴: 스레드 없는 동시 실행 (0) | 2020.12.06 |
Boost.Asio 개요 - 핵심 개념 및 기능 (0) | 2020.12.05 |
Boost.Asio 개요 - 이론적 해석 (0) | 2020.12.04 |
Boost.Asio 개요 (0) | 2020.12.04 |