Asio는 크로스 플랫폼 C++ 라이브러리로, 네트워크 및 저수준 입출력(I/O) 프로그래밍을 위한 비동기(Asynchronous)와 동기(Synchronous) 인터페이스를 제공한다. 원래는 Boost 프로젝트의 일부인 Boost.Asio로 시작했으며, 이후 독립형 헤더‑전용 라이브러리 형태인 Standalone Asio도 배포되고 있다. 주요 특징은 다음과 같다.
주요 기능 및 구성 요소
| 기능 | 설명 |
|---|---|
| 비동기 I/O | 콜백, 퍼미션 기반 작업을 통해 스레드 풀 없이도 높은 동시성을 구현한다. |
| 동기 I/O | 전통적인 블로킹 방식 API도 제공하여 기존 코드와 호환이 가능하다. |
| io_context (구 io_service) | 모든 비동기 작업을 스케줄링하고 실행하는 핵심 실행자 객체이다. |
| 소켓 타입 | TCP, UDP, Unix domain socket, 로컬(시리얼) 포트 등 다양한 프로토콜을 지원한다. |
| 타이머 | 고정밀 타이머와 deadline_timer 등을 제공하여 시간 기반 작업을 관리한다. |
| 멀티플렉싱 | select, poll, epoll, kqueue 등 운영체제 별 I/O 멀티플렉싱 메커니즘을 추상화한다. |
| 헤더‑전용 | 별도의 바이너리 링크 없이 헤더 파일만 포함하면 컴파일이 가능하다. |
| C++ 표준과 호환 | C++11 이후의 표준 기능(람다, std::function, std::thread 등)을 활용하도록 설계되었다. |
역사적 배경
- 저자: Christopher M. Kohlhoff가 주도적으로 개발하였다.
- 첫 공개: 2005년경 Boost.Asio 형태로 최초 공개되었다. (정확한 연도는 Boost 릴리즈 기록을 참고)
- 표준화 진행: Asio의 설계는 C++ Networking TS(Networking Technical Specification)와 유사한 인터페이스를 제공하며, 일부 기능은 C++20 이후 표준 라이브러리에도 반영될 전망이다.
사용 예시
#include <asio.hpp>
int main() {
asio::io_context io;
asio::ip::tcp::resolver resolver(io);
auto endpoints = resolver.resolve("example.com", "80");
asio::ip::tcp::socket socket(io);
asio::async_connect(socket, endpoints,
[&](std::error_code ec, const asio::ip::tcp::endpoint&) {
if (!ec) {
// 연결 성공 후 처리
}
});
io.run(); // 이벤트 루프 실행
}
위 코드는 Asio의 비동기 연결을 구현한 간단한 예시이다. io_context가 이벤트 루프 역할을 수행하고, 콜백 함수가 연결 완료 시 호출된다.
적용 분야
- 네트워크 서버 및 클라이언트 구현 (HTTP, WebSocket, RPC 등)
- 실시간 데이터 스트리밍
- IoT 디바이스와의 시리얼 통신
- 고성능 게임 서버·클라이언트
- 타이머 기반 작업 스케줄링
라이선스
Boost.Asio는 Boost Software License 1.0을 따르며, Standalone Asio 역시 동일한 라이선스를 적용한다. 이는 상업적 이용을 포함한 광범위한 재배포가 허용된 자유로운 라이선스이다.
참고 사항
- Asio는 표준 C++ 라이브러리와 별개로 제공되며, 컴파일러와 운영체제에 따라 일부 기능(예:
epoll기반 멀티플렉싱)은 지원 여부가 다를 수 있다. - 최신 C++ 표준과의 호환성을 유지하기 위해, 라이브러리 버전별로 요구되는 최소 C++ 표준(C++11, C++14 등)을 확인하는 것이 필요하다.