본문 바로가기

프로그래밍

Boost::asio – Overview – Core Concepts and Functionality – Basic Boost.Asio Anatomy

출처: http://www.dhsnest.com/2010/03/boostasio-overview-core-concepts-and-functionality-basic-boostasio-anatomy/



Boost.Asio 살펴보기

 

Boost.Asio는 소켓같은 입출력 객체의 동작에 동기/비동기 두가지 방법을 모두 사용합니다. Boost.Asio를 사용하기 전에 여러분의 프로그램에서 어떻게 동작하는지 Boost.Asio의 부분들에 대한 개념적 그림을 보면 도움이 될 것입니다.

 

입문자를 위한 예제에서 소켓의 접속 동작이 어떻게 동작하는지 살펴보겠습니다. 동기적 동작부터 살펴보겠습니다.  사용자 삽입 이미지

 

여러분의 프로그램은 적어도 하나의 io_service 객체를 갖습니다. io_service는 여러분의 프로그램과 운영체제의 입출력 서비스의 연결을 나타냅니다.

boost::asio::io_service io_service;

 

입출력 동작을 하기 위해 여러분의 프로그램은 TCP 소켓같은 I/O 객체가 필요합니다.

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

 

동기적 접속 동작이 실행될 때, 다음 이벤트들이 발생합니다:

 

1. 여러분의 프로그램은 I/O 객체를 호출해 접속 동작을 초기화합니다.

socket.connect(server_endpoint)

 

2. I/O 객체는 이 요청을 io_service로 전달합니다.

 

3. io_service는 접속 동작을 실행하기 위해 운영체제를 호출합니다.

 

4. 운영체제는 동작의 결과를 io_service로 반환합니다.

 

5. io_service는 동작에서 발생한 모든 오류를 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. 여러분의 프로그램은 I/O 객체를 호출해 접속 동작을 초기화합니다.

socket.async_socket(server_endpoint, your_completion_handler);

 

your_completion_handler는 함수 또는 서명이 있는 함수 객체입니다:

void your_completion_handler(const boost::system::error_code& ec);

 

추가적인 서명은 실행되는 비동기 동작에 따라 요구됩니다. 참고 문서에 각각의 동작에 적합한 형태가 명시되어 있습니다.

 

2. I/O 객체는 이 요청을 io_service로 전달합니다.

 

3. io_service는 운영체제로 비동기 접속 시작 신호를 보냅니다.

 

시간이 지나면.(동기적 동작의 경우 이 대기 시간은 접속 동작에 포함됩니다.)

 

사용자 삽입 이미지

 

4. 운영체제는 io_service가 접근가능한 큐에 접속 동작이 완료되었음을 전달합니다.

 

5. 여러분의 프로그램은 결과를 추적하기 위해 반드시 io_service::run()(또는 io_service의 유사한 멤버 함수 중 하나)를 호출해야 합니다.io_service::run() 호출은 완료되지 않은 비동기 동작이 있는 동안 블록킹됩니다. 따라서 일반적으로 첫 비동기 동작이 실행된 이후에 호출합니다.

 

6. io_service::run() 함수의 내부에서, io_service는 동작 결과를 큐에서 꺼내 error_code로 번역해 your completion handler로 전달 합니다.

 

이 것은 단순화된 Boost.Asio의 동작입니다. 만약 다른 형태의 비동기 동작을 하기 위해 Boost.Asio를 확장과 같이 보다 심화된 내용이 필요하다면 보다 자세히 문서를 살펴 보길 원하게 될 것입니다.