핸들러 추적 (Handler Tracking) 비동기식 프로그램의 디버깅을 지원하기 위해 Boost.Asio는 핸들러 추적 기능을 지원한다. BOOST_ASIO_ENABLE_HANDLER_TRACKING을 정의하여 기능이 활성화되면, Boost.Asio는 표준 오류 스트림(standard error stream)에 디버깅 출력을 기록한다. 출력은 비동기식 작업과 핸들러 간의 관계를 기록한다. 이 기능은 디버깅할 때, 비동기식 작업이 체인으로 연결된 방식이나 보류 중인(pending) 비동기식 작업이 무엇인지 알아야 하는 경우 유용하다. 다음은 HTTP 서버 예제를 실행하고 단일 요청을 처리한 후 "Ctrl+C"를 통해 종료할 때의 출력이다: @asio|1589424178.741850|0*1|signal_..
사용자 지정 메모리 할당 (Custom Memory Allocation) 많은 비동기 작업은 작업과 관련된 상태를 저장하기 위해 객체를 할당해야 한다. 예를 들어, Win32 구현에서는 Win32 API 함수에 전달하기 위해 OVERLAPPED-파생 객체가 필요하다. 또한, 프로그램에는 일반적으로 쉽게 식별할 수 있는 비동기 작업 체인이 포함되어 있다. 반이중(half duplex) 프로토콜 구현(예: HTTP 서버)에서는 클라이언트당 하나의 작업 체인(수신 후 전송)을 갖는다. 전이중(full duplex) 프로토콜 구현에서는 병렬(parallel)로 실행되는 두 개의 체인을 갖는다. 프로그램은 이 점을 활용하여 체인의 모든 비동기 작업에 대한 메모리를 재사용할 수 있어야 한다. 사용자 정의 Handl..
라인 기반 작업 (Line-Based Operations) 일반적으로 사용되는 많은 인터넷 프로토콜은 라인 기반이며, 이는 문자 시퀀스 "\r\n"로 구분되는 프로토콜 요소를 가지고 있다는 것을 의미한다. 예로 HTTP, SMTP 그리고 FTP 등이 있다. 구분 기호를 사용하는 다른 프로토콜뿐만 아니라 라인 기반 프로토콜의 구현을 보다 쉽게 접근하기 위해서, Boost.Asio는 read_until()와 async_read_until() 함수를 포함하고 있다. 다음 예제는 클라이언트의 HTTP 요청의 첫 번째 라인을 수신하는 위해 HTTP 서버에서 async_read_until()을 사용하는 방법을 보여준다: class http_connection { ... void start() { boost::asi..
Reactor 스타일 작업 (Reactor-Style Operations) 때때로 프로그램은 I/O 작업 자체를 수행하려는 타사 라이브러리와 통합되어야 한다. 이를 용이하게 하기 위해 Boost.Asio는 소켓을 읽기 준비, 쓰기 준비 또는 보류 중인 오류 조건을 대기하는 데 사용할 수 있는 동기식 및 비동기식 작업을 포함하고 있다. 예를 들어, 넌-블럭킹 읽기를 수행하려면 다음과 같이 사용할 수 있다: ip::tcp::socket socket(my_io_context); ... socket.non_blocking(true); ... socket.async_wait(ip::tcp::socket::wait_read, read_handler); ... void read_handler(boost::system..
스트림 짧은 읽기와 짧은 쓰기 (Streams, Short Reads and Short Writes) Boost.Asio의 많은 I/O 개체는 스트림 지향적(stream-oriented)이다. 이는 다음을 의미한다: 메시지 경계가 없다. 전송되는 데이터는 바이트의 연속된 순서다. 읽기나 쓰기 작업은 요청된 바이트 수보다 적은 바이트 수를 전송할 수 있다. 이를 짧은 읽기 또는 짧은 쓰기라고 한다. 스트림 지향 I/O 모델을 제공하는 객체는 다음 유형 요건 중 하나 이상을 제공한다: SyncReadStream, 여기서 read_some()이라는 멤버 함수를 사용하여 동기식 읽기 작업을 수행한다. AsyncReadStream, 여기서 async_read_some()이라는 멤버 함수를 사용하여 비동기식 읽기 ..