Skip to content

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를 추가하면 된다.

undefined reference to `AcceptEx@32' ...

아래는 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

boost::asio::io_service

서비스 객체 색성

boost::asio::ip::tcp::endpoint
boost::asio::ip::tcp::v4()

boost::asio::ip::tcp::endpoint
boost::asio::ip::tcp::address::from_string()

IP Address & Port Number 설정 위한 endpoint 객체 생성.

boost::asio::ip::tcp::socket

소켓에 io_service 연결.

boost::asio::ip::tcp::acceptor

클라이언트 소켓을 연결할 Acceptor 생성후 io_service와 endpoint연결.

acceptor.accept(socket);

클라이언트 연결 준비.

socket.connect(endpoint);

서버에 연결.

socket.write_some()
socket.async_write_some()
socket.read_some()
socket.async_read_some()

읽기 & 쓰기.

socket.close();

소켓 닫기.

Error code

ASIO를 사용하면서 발생할 수 있는 에러코드에 대한 설명.

Simple example

대부분의 동작이 함수에 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

Guide

Example

Tip

References


  1. WS2_32.lib 을 링크한다. 

  2. Boost_asio_error_code_0_error.pdf 

  3. How_does_libuv_compare_to_Boost_ASIO_-_Stack_Overflow.pdf 

  4. Asioref-1.10.2.pdf 

  5. Boost.asio-1.35-ko.pdf 

  6. BoostAsio_1.35_-tutorial-_ko.doc.zip 

  7. Boost_asio.pdf 

  8. Jeremyko.blogspot.kr_-boost-_Asynchronous_Input_and_Output.pdf 

  9. Boost_-_asio_Asynchronous_Input_and_Output.pdf 

  10. Boost_asio_asynchronous_server_client_step1.pdf 

  11. Asio_asynchronous_echo_server.pdf