Asio
Asio is a freely available, open source, cross-platform C++ library for network programming. It provides developers with a consistent asynchronous I/O model using a modern C++ approach. Boost.Asio was accepted into the Boost library on 30 December 2005 after a 20-day review. The library has been developed by Christopher M. Kohlhoff since 2003. A networking proposal based on Asio was submitted to the C++ standards committee in 2006 for possible inclusion in the second Technical Report on C++ Library Extensions (TR2).
How to compile
asio 라이브러리를 MinGW에서 사용하기 위해서는 -lWS2_32
옵션1을 추가해야 한다.
MinGW에서 만약 아래와 같은 메시지가 출력된다면 링커 옵션에 -lmswsock
를 추가하면 된다.
아래는 Linux G++에서 사용한 컴파일 & 링크 방법이다.
g++ -o echo-server.o -c echo-server.cpp -std=c++11
g++ -o echo-server echo-server.o -lboost_system -lpthread
아래는 실제 MinGW에서 사용한 컴파일 & 링크 방법이다.
g++ -o echo-server.o -c echo-server.cpp -std=c++11 -DWINDOWS
g++ -o echo-server echo-server.o -lboost_system.dll -lWS2_32 -lmswsock
덧붙여, 아래와 같은 경고가 출력될 수 있다.
C:\workspace\root\var\opm\local\include/boost/asio/detail/config.hpp:551:5: warning: #warning Please
define _WIN32_WINNT or _WIN32_WINDOWS appropriately. [-Wcpp]
이경우 아래와 같이 Windows관련 define을 추가해야 한다.
// config.h
#ifdef WINDOWS
#define WIN32_LEAN_AND_MEAN
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#endif
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0410
#endif
// Minimum Platform version.
#ifndef WINVER
#define WINVER _WIN32_WINNT
#endif
// Minimum Internet Explorer version.
#ifndef _WIN32_IE
#define _WIN32_IE 0x0700
#endif
#endif // WINDOWS
boost::asio::io_service
The io_service class provides the core I/O functionality for users of the asynchronous I/O objects, including:
- boost::asio::ip::tcp::socket
- boost::asio::ip::tcp::acceptor
- boost::asio::ip::udp::socket
- boost::asio::deadline_timer
I/O Services and I/O Objects
비동기적인 데이터처리는 I/O services 와 I/O objects를 기반으로 이루어진다. I/O services는 비동기처리를 가능하게 해주는 운영체계 인터페이스를 추상화하고, I/O objects는 특정 비동기 동작을 시작하기 위해 사용된다. boost::io_service 클래스가 I/O services를 위한 클래스이며,각 운영체계에 최적화되어 구현되어 있다.
Boost.Asio에는 각각의 I/O Object를 위한 몇몇 클래스들이 존재한다. 이 중에서 boost::asio::ip::tcp::socket 는 네트워크 송수신, boost::asio::deadline_timer 는 타이머기능을 수행한다.
Server & Client
서버와 클라이언트의 통신 방법은 아래와 같다.
Server | Client | Brief |
| 서비스 객체 색성 | |
| | IP Address & Port Number 설정 위한 endpoint 객체 생성. |
| 소켓에 io_service 연결. | |
| 클라이언트 소켓을 연결할 Acceptor 생성후 io_service와 endpoint연결. | |
| 클라이언트 연결 준비. | |
| 서버에 연결. | |
| 읽기 & 쓰기. | |
| 소켓 닫기. |
Error code
ASIO를 사용하면서 발생할 수 있는 에러코드에 대한 설명.
Simple example
- C++ network library asio
- Example: Asio_example_130327.zip
대부분의 동작이 함수에 handler를 인자로 넘겨주고 작업이 완료되면 handler가 불리는 방식으로 처리된다.
// Object initialize:
asio::io_service io_service;
tcp::socket _socket = new tcp::socket(io_service);
// ACCEPT
tcp::acceptor _acceptor;
_acceptor.async_accept( _acceptSocket, handler );
// SEND
asio::async_write( _socket, asio::buffer(buffer, len), handler );
// RECEIVE
_socket->async_read_some( asio::buffer(buffer, len), handler );
Async Echo Server/Client
비동기 ECHO 서버 및 클라이언트 코드는 여기에서 확인할 수 있다.
UDS Server/Client
UDS를 사용한 샘플 코드는 여기에서 확인할 수 있다.
Documentation
- Naver laster40 blog - Boost ASIO Tutorials
- http://blog.naver.com/laster40/49785570
-
Blog.naver.com-laster40-boost-asio.zip - ASIO의 특징.
- ASIO endpoint & address.
- ASIO 튜토리얼 분석(1).
- ASIO 튜토리얼 분석(2) A synchronous TCP daytime server.
- ASIO 튜토리얼 분석(3) A synchronous TCP daytime client.
- ASIO 튜토리얼 분석(4) An asynchronous TCP daytime server.
- ASIO 예제 ( 1 ) - Custom Allocator.
- ASIO 예제 ( 2 ) - 참조 카운터 Buffer.
- ASIO 쓰레드 모델 ( 1 ) - single thread model.
- ASIO 쓰레드 모델 ( 2 ) - multi thread model - io_service Per Thread.
- ASIO 쓰레드 모델 ( 3 ) - multi thread - single io_service.
- ASIO 로 NetEngine만들기 ( 1 ) - 요구사항.
See also
Favorite site
Documentation
Tutorials
- boost::asio - 비동기 소켓 I/O 클래스 한글 메뉴얼 5
- GET BOOST - Boost 1.35에 새롭게 추가된 asio의 튜토리얼을 번역 6
- Boost Asio 한글 듀토리얼 7
Guide
- [추천] boost - asio, Asynchronous Input and Output 8, 9
- [추천] ( Boost ) boost::asio Part1.
- boost asio Part1, 2
-
http://blog.daum.net/aswip/8429366 - boost::asio 비동기 서버/클라 step 1 10
- Timer.1 - Using a timer synchronously
- io_service가 항상 실행되도록 보장하는 방법
- [추천] Boost.Asio 기반 비동기(asynchronous) echo server 11
- Boost.Asio를 이용한 네트워크 프로그래밍 (PDF)
Example
- [추천] Boost.asio Examples
- Stackoverflow: Audio streaming using C++ tutorial and sample code
- Github: A simple boost asio based mjpeg streaming server
- Boost.Asio with Protocol Buffers code sample (Protobuf)
Tip
References
-
WS2_32.lib 을 링크한다. ↩
-
Boost_asio_error_code_0_error.pdf ↩
-
How_does_libuv_compare_to_Boost_ASIO_-_Stack_Overflow.pdf ↩
-
Asioref-1.10.2.pdf ↩
-
Boost.asio-1.35-ko.pdf ↩
-
BoostAsio_1.35_-tutorial-_ko.doc.zip ↩
-
Boost_asio.pdf ↩
-
Jeremyko.blogspot.kr_-boost-_Asynchronous_Input_and_Output.pdf ↩
-
Boost_-_asio_Asynchronous_Input_and_Output.pdf ↩
-
Boost_asio_asynchronous_server_client_step1.pdf ↩
-
Asio_asynchronous_echo_server.pdf ↩