Boost.Asio 활용 방법 중 괜찮을 글이 있어서 원저자의 동의를 받고 소개합니다.




boost.asio로 작성한 http client

http://devnote.tistory.com/226



WinHTTP를 쓰려다가 좌절하고… boost::asio로 작성.

#include "HttpClient.h"
void main()
{
    std::wcout.imbue( std::locale("") );
    AsioHttp::Client client;
    client.Init( "leafbird.net", CP_UTF8 );
    std::wcout << client.Request( "/index.php" ).strData << std::endl;
}

개인 프로젝트에 쓰려고 심플하게 만들었다. 이왕에 asio 사용한 김에 format같은 다른 모듈도 내부에서 사용했음. asio를 한 번도 써 본적도 없고 공부한 적도 없는데, 돌아다니다 보니 http client로 사용하는 예제 코드가 있길래 그냥 그것 기반으로 인터페이스만 정리했다.

http client를 알아볼 때 내가 단골 손님으로 들던 예제가 Naver OpenAPI인데, 이 물건으로 네이버 검색을 하려면 아래처럼 한다.

#include "HttpClient.h"
void main()
{
    std::wcout.imbue( std::locale("") );
    AsioHttp::Client client;
    // call Naver OpenAPI
    client.Init( "openapi.naver.com", CP_UTF8 );
    boost::format fmt( "/search?key=%1%&query=%2%&display..." );
    fmt % "개인 개발자 등록키 값"
        % AsioHttp::ToUrlString( "안철수" );
    std::wcout << client.Request( fmt.str().c_str() ).strData;
}

검색어로 한글을 쓰려고 보니 유의해야 할 점이 하나 있던데, UTF8 인코딩 문자만 받는다는 것. 근데 URL에서의 인코딩 문자 데이터 표기방식이 일반적으로 C++에서 쓰는 바이트 정보랑 다르다. ‘안철수’라는 문자를 UTF8로 인코딩한 후  std::string에 담은 값을 바이트 단위로 다시 ‘%’를 붙여서 문자열화 해야 됨. 바이트 데이터가 0xaa 0xbb 0xcc 0xdd 0xee 0xff라면 ‘%aa%bb%cc%dd%ff’처럼 바꿔야 한다는 말이다. 그래서 ToUrlString(...) 이라는 유틸리티 함수도 같이 만들어 두었다. 궁금한 사람은 직접 코드 열어보시오.

만약에 이 물건으로 C++ 프로젝트에서 AJAX 통신을 하겠다고 한다면, response 데이터의 처리가 문제다. 데이터 형식이 json 아니면 xml이 될 텐데.. 이전 포스팅에서도 설명했듯이 C++에서는 두 포맷 모두 심플하게 다루는 게 쉽지가 않다. 취미로 만드는 게임 엔진에 랭크 기능을 웹서버로 만들어 붙이고 통신할 목적으로 만들었는데… response를 어떻게 처리할지는 좀 더 생각해 봐야지.

저작자 표시
신고
by 흥배 2013.07.18 08:00

근래 gcc나 Clang 등이 C++11 지원을 완료함에 따라서 기존에 C++03 방식으로 만들었던 C++ 프로그램에 조금씩 C++11 방식이 적용되고 있다.


얼마전에 Boost 라이브러리가 1.54 버전이 나왔는데 Asio 예제 코드를 03과 11 버전 두 가지로 나누어서 제공하고 있다.


http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/examples.html





http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/examples/cpp11_examples.html



이제 03 방식의 관습에서 벗어나서 C++11 방식으로 의식하면서 사용해야 할 것 같다



저작자 표시
신고
by 흥배 2013.07.11 08:00

Boost.Asio의 장점 중의 하나가 멀티 플랫폼을 지원하면서 각 플랫폼의 특징을 죽이지 않고 사용할 수 있도록 해주는 것이다.

 

Boost 라이브러리 1.49.0 버전에서 Windows에서 HANDLE의 비동기 조작을 할 수 있도록 해주는 windows::object_handle 클래스가 추가 되었다.

 

아래의 코드는 프로세스를 비동기로 실행 후 종료할 때까지 대기 하다가 프로세스가 종료하면 등록된 함수를 호출한다.

 

#include <iostream>

#include <string>

#include <boost/asio.hpp>

#include <boost/asio/windows/object_handle.hpp>

 

namespace asio = boost::asio;

 

void on_end_process(const boost::system::error_code& ec)

{

    if (!ec)

       {

        std::cout << "end process" << std::endl;

    }

}

 

int main()

{

    asio::io_service io_service;

 

    PROCESS_INFORMATION pi = {};

    STARTUPINFO si = {};

 

    si.cb = sizeof(si);

 

    std::string proc = "notepad";

       CreateProcessA(NULL, &proc[0], NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, (LPSTARTUPINFOA)&si, &pi);

   

    asio::windows::object_handle process(io_service, pi.hProcess);

    process.async_wait(on_end_process);

 

    io_service.run();

}

 

object_handle에는 wait/async_wait() 있으며 내부에서 WaitForSingleObjecr 호출한다. 프로세스 이외에도 CreateEvent 만든 핸들을 SetEvent 때까지 대기시킬 때도 사용할 있다.

 

 

 

 

출처: http://d.hatena.ne.jp/faith_and_brave/20120229/1330496131

 

 

저작자 표시
신고
by 흥배 2013.06.18 08:00

대부분의 프로그램은 외부 세계와 교류한다. 이것은 파일을 통해서, 네트워크를 통해서, 시리얼 케이블을 통해서 또는 콘솔을 통해서 한다. 네트워크의 경우 I/O 명령 완료까지 긴 시간이 걸린다. 이것은 애플리케이션 개발에게 있어서 피할 수 없는 도전이다.

Boost.Asio
는 이와 같이 긴 실행 시간이 걸리는 조작을 다룬다. 스레드나 명시적인 lock 없이.

Boost.Asio
C++ 시스템 프로그래밍 프로그래머를 대상으로 하고 있다. 이들은 네트워크와 같은 OS의 기능에 빈번하게 접근할 필요가 있는 프로그래머 이다. Boost.Asio는 다음의 목표를 가지고 있다.

 

이식성:폭 넓게 사용되고 있는 OS를 지원 해야 한다. OS가 달라도 일관된 동작을 제공한다.

확장성:1000대 규모의 병렬 처리의 네트워크 애플리케이션 개발에도 사용할 수 있는 라이브러리이다. OS 마다 확장성을 실현하기 위한 최적의 사양을 가지고 있다.

효율성Scatter-gather I/O등의 수법을 사용할 수 있어야 한다. 또 데이터 복사를 최소화 해야 한다.

 

BSD소켓과 같이 확립된 API에서 모델의 컨셉을 얻는다: BSD 소켓 API는 널리 구현되어 있다. 다른 프로그래밍 언어에서도 네트워크 API로 비슷한 인터페이스를 가지고 있다. 이치에 맞게 Boost.Asio는 존재하는 프랙티스를 살려야 한다.

 

간단하게 사용할 수 있어야 한다:이 라이브러리는 툴 킷을 사용하는 새로운 유저에 대해서 참가 장벽이 낮을 필요가 있으므로 프레임워크 방식이 아닌 툴 킷 방식을 취한다. 적은 룰과 가이드 라인을 학습하는 것만으로 사용할 수 있게 한다. 그 후는 라이브러리의 특정 함수의 사용 법에 대해서 이해하면 사용할 수 있다.

 

진화된 추상화에 의한 기초: 라이브러리는 높은 레벨의 추상화를 다른 라이브러리 개발자가 할 수 있도록 해야 한다. 예를 들면 HTTP와 같이 자주 사용되는 프로토콜의 구현에 관해서 처음은 Boost.Asio는 네트워크를 통한 비동기 I/O만으로 목표를 한정하고 있지만 다른 OS의 리소스 예를 들면 시리얼포트나 파일 등을 사용할 수 있도록 확장하고 있다.

 

 

출처: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/overview.html

 

저작자 표시
신고
by 흥배 2013.06.12 08:00

http://warmz.tistory.com/904 Mac에서 빌드 방법을 참고 했습니다.

 

제가 사용한 linux OpenSUSE 12.3 64Bit, Boost 라이브러리 1.53 버전입니다.

 

1. Boost 라이브러리 다운로드 후 압축 풀기

 

2. 터미널에서 압축을 푼 디렉토리로 이동 후 아래처럼 입력

$ ./bootstrap.sh

 

3. 생성된 b2를 사용하여 Boost 라이브러리 빌드하기

$ ./b2 toolset=gcc link=static threading=multi address-model=64

 

빌드가 끝나면 Boost 라이브러리 디렉토리 안의 stage/lib 디렉토리에 빌드 릴리즈용 lib 파일 생성.


./b2 toolset=gcc link=static threading=multi address-model=64 variant=debug
./b2 toolset=gcc link=static threading=multi address-model=64 variant=release



 


 

b2의 옵션 설명

출처: https://sites.google.com/site/boostjp/howtobuild

 

toolset

하나의 머신에 서로 다른 종류의 컴파일러가 인스톨 되어 있는 경우는 toolset 명령어로 지정할 수 있다. 예를 들면:

borland  : Borland사의 컴파일러

dmc          : Digital Mars사의 컴파일러

darwin    : Apple에서 손을 댄 gcc 컴파일러(Mac OS)

gcc            : GNU 프로젝트에 의한 컴파일러

intel         : Intel사 컴파이럴

msvc         : Microsoft사 컴파일러

로 지정할 수 있다. msvc-9.0 (Visual C++ 2008), msvc-10.0 (Visual C++ 2010)와 같이 버전 지정도 할 수 있다.

 

link

이것은 static, shared 라이브러리를 만들지를 지정하는 명령어

link=static,shared

와 같이 사용한다.

lib, dll (Windows)

a, dylib (Mac OSX)

a, so (Other Systems)

와 같은 라이브러리 파일을 생성한다.

 

threading

multi: 멀티 스레드 라이브러리 생성

single: 싱글 스레드 라이브러리 생성.

 

variant

debug: 디버그 빌드를 생성

release: 릴리즈 빌드를 생성

 

 

 

 

아래의 글도 아주 좋습니다

(한글)Install boost library for Linux

http://gilgil.net/?document_srl=7273


LLVM

./b2 toolset=clang linkflags="-stdlib=libc++" cxxflags="-std=c++11 -stdlib=libc++"



boost 1.54.0 library 설치

http://pururoong.tistory.com/36

저작자 표시
신고
by 흥배 2013.06.10 08:00

[ Windows ]

Boost 라이브러리 빌드 및 설치 - VC++ (VS2012, Boost 1.53)

http://warmz.tistory.com/903


boost 간단 설치기 (Windows환경)  - VS 2010 중심

http://blog.naver.com/ykish/100188390123


Boost 64비트로 빌드하기

http://blog.naver.com/lunu/100160768950



VS2008에서 Boost 빌드하기

http://blog.naver.com/dbwls0105/30069044946


버전 별로 이미 빌드된 라이브러리 배포하는 사이트

http://boost.teeks99.com/bin/




[ Mac ]

Boost 라이브러리 빌드 및 설치 - Mac 

http://warmz.tistory.com/904



Linux ]

(한글)Install boost library for Linux 

http://www.gilgil.net/7273




[ Android ]

Android NDK를 사용한 boost library 빌드 방법

http://imhallower.blog.me/90169489876





ps: 

일본 Boost 라이브러리 사이트의 빌드 글

https://sites.google.com/site/boostjp/howtobuild

저작자 표시
신고
by 흥배 2013.06.06 21:30

어제 오전에 KGC 2012 강연을 무사히 마쳤습니다^^

내용이 어떤 분에게는 너무 쉽고, 또 어떤 분에게는 잘 이해 안가는 부분도 있으리라 생각합니다. 

Boost.Asio를 올바르게 이해하기 위해서는 비동기 프로그래밍, 네트웍 프로그래밍, 멀티 스레드 프로그래밍에 대한 이론적인 지식이 필요합니다.


만약 Asio에 대한 이해가 부족하다면 위에 열거한 이론 지식을 좀 더 공부하시면 좋을 것 같습니다.


그리고 어제 강연이 좀 엉성한면이 있었던 점 양해바랍니다^^;;;




컴파일을 위해서는 Boost 라이브러리와 Visual Studio 2012 또는 2010 이 필요합니다.

[KGC2012]BoostAsio_Demo.zip



그리고 저 프리랜서 아닙니다. 지금은 쉬고 있습니다^^;






저작자 표시
신고
by 흥배 2012.10.11 16:32

5월에 '온라인 서버 개발자 모임'의 3회 공개 강연회에서 발표한 자료입니다.

관련된 예제 코드도 같이 올립니다.


[SDC 3rd]Boost_multiindex(2012-05-19).zip




회사 동료분이 제 강연을 동영상으로 촬영한 것이 있어서 이것도 올립니다(제가 보니 상당히 오르라드네요^^;)




저작자 표시
신고
by 흥배 2012.08.31 09:00

대부분의 boost 라이브러리는 원하는 기능의 헤더 파일을 포함하면 사용할 수 있지만 OS의 기능을 사용하는 것들은 빌드를 해야 합니다.

 

저는 boost 라이브러리 1.50을 다운로드 받아서

E:\Dev\CommonLib\boost_1_50_0

디렉토리에 압축을 풀었습니다.

 

먼저 빌드 실행 파일을 만들기 위해서 위의 디렉토리에서 bootstrap.bat 를 실행합니다.

 

디렉토리에 b2.exe와 bjam.exe 파일 두개가 만들어졌습니다.

저는 이중 bjam.exe를 사용하여 빌드를 하였습니다. 참고로 예전에는 bjam.exe를 사용하였으나 근래에는 b2.exe로 넘어가는 추세입니다.

 

제 컴퓨터에는 VC10과 VC11(RC 버전)이 있는데 기본적으로 가장 최신의 VC를 대상으로 빌드를 하는 것 같습니다.

물론 옵션을 지정하면 VC 버전이나 64비트, 빌드 출력 디렉토리도 지정할 수 있습니다.

 

옵션으로 디렉토리를 지정하지 않으면 라이브러리 파일은 stage\lib 디렉토리에 생성됩니다.

 


추가

위의 방식으로 하면 '런타임 라이브러리 정적 링크' 라이브러리(빌드 후 만들어지는 lib 파일에 -sgd 가 붙는)가 만들어 지지 않습니다.

그래서 저는 다시 b2.exe 파일을 사용하여 빌드를 했습니다.

b2.exe 명령어를 사용할 때 옵션으로 -prefix (빌드 라이브러리가 생성될 디렉토리)를 붙이지 않으면 이상한 곳에 만들어질 수 있으니 꼭 붙여야 합니다.

저는 stage/lib 디렉토리에 만들어지게 하고 싶어서 다음과 같이 했습니다.

b2 -prefix=.\stage\lib --toolset=msvc runtime-link=static

예)
VS 2005
/MT, /MTd
b2 -prefix=.\stage\lib --toolset=msvc-8.0 runtime-link=static 

/MD, /MDd
b2 -prefix=.\stage\lib --toolset=msvc-8.0 runtime-link=shared


VS 2012
/MT, /MTd
b2 --stagedir=stage --toolset=msvc-11.0 runtime-link=static 

/MD, /MDd
b2 --stagedir=stage --toolset=msvc-11.0 runtime-link=shared

64비트
/MT, /MTd
b2 --stagedir=stage64 address-model=64 --toolset=msvc-11.0 runtime-link=static 

/MD, /MDd
b2 --stagedir=stage64 address-model=64 --toolset=msvc-11.0 runtime-link=shared




빌드 방법 참고 

1. Boost 라이브러리 빌드 링크 모음 
http://jacking.tistory.com/1068


2. (일본어) http://blog.goo.ne.jp/nourea/e/8028f3c519e881dac5885575e4a0a96f

3. Boost 빌드 http://lunapiece.net/Article/27356

신고
by 흥배 2012.07.31 09:00

BOOST_COMPILER 라는 지시어를 사용하면 컴파일러 종류와 버전을 알려줍니다.



#include <iostream>
#include <boost/config.hpp>

int main()
{
    std::cout << BOOST_COMPILER << std::endl;
    return 0;
}





출처 : 인터넷 어딘가에서....-_-;

저작자 표시
신고
by 흥배 2012.07.09 09:00
| 1 2 3 4 5 6 7 |

티스토리 툴바