본문 바로가기

프로그래밍280

boost::bind 의 기본 사용법 예제 boost::bind 의 이용 예제.. 사실상 응용이라던가 더 복잡한 쓰임은 있지만 대략 이런 역활을 한다 는 것을 익힐 뿐이고 상세한 이용은 검색을 더 해보는 것이 좋을 듯. 실제 asio 에제를 보면 더 많이 , 여러기능이 쓰이는 것을 알 수 있다 예제 // start #include "stdafx.h" #include #include #include #include #include int no_arg() { return 0; } struct one_arg { int operator () (int i) const { return i; } typedef int result_type; }; struct two_arg { int val; two_arg(int v) : val(v) {} int f(int i.. 2011. 11. 16.
Default http://udn.epicgames.com/Three/WebHome.html 기본적인 구동 모습 2011. 11. 15.
boost::mem_fn 예제에 std::tr1::tuple 예제의 조합 mem_fn 을 이용해서 어떤 공통된 function 을 구동 시키되 넘기는 변수는 tuple 을 이용해 유동성 있게 넘기는 방법을 예제로 만들었습니다 1타 2피! 예제랄까... serialize 때 조금 심플해 보일 순 있겠네요.. 가독성이나 처리 문제등 개선점은 있지만;; // start #include "stdafx.h" #include #include #include #include class CWork { private: typedef void(*const fun)(); std::tr1::reference_wrapper m_RunFunc; int m_Val; public: void SetWrapper(std::tr1::reference_wrapper f) { m_RunFunc = f; } tem.. 2011. 11. 15.
boost::asio 비동기 서버/클라 step 1 boost asio 를 이용해서 비동기 서버 / 클라 만들어보기 정리해 봅시다~ Client -> Recv -> Recv Queue -> Worker Thread -> Send Queue -> Send Callback -> Client 분홍색 까지의 부분을 소스 예제로 봅시다! 어디까지나 예제 차원으로 (원래 asio 예제도 그렇고) class 내부에 막 때려넣었으니 따라하거나 이상한 코딩하는 사람으로 오해하지마세요 ^^; 소스 퍼가실 때 소스코드 부분을 더블 클릭해서 전체 선택 후 카피가 좋습니다 드래그 하면 한줄로 복사되요 컴파일 관련은 이전 글을 참고해 주세요 서버 예제 #include "stdafx.h" #include #include #include #include #include #includ.. 2011. 11. 9.
WorkQueue & Worker 보호되어 있는 글 입니다. 2011. 11. 8.
boost::thread / boost::thread_group 무슨 말이 필요하랴.. 예제로 보자.. 참고로 join 은 thread 시작을 의미하는게 아니고 thread 가 정지할 때까지 기다렸다가 후 처리를 한다는 말이다.. 초기화 할 때 이미 thread 는 시작된다 #include void GlobalFunction() { while(true) { } } int _tmain() { // default { boost::thread t(boost::bind(&GlobalFunction)); t.join(); } // group { boost::thread_group tg; tg.create_thread(boost::bind(&GlobalFunction)); tg.add_thread(new boost::thread(boost::bind(&GlobalFunction.. 2011. 11. 8.
ByteStream / CallbackMrg 보호되어 있는 글 입니다. 2011. 11. 5.
BYTE (unsigned char) Stream 에 boost::pool 적용 이미 공개했던 BYTE Stream 이 워낙에 new delete 를 자주 호출 하는 관계로 메모리 단편화의 문제가 생길 수 있을 것 같아 (속도 차는 측정해본 결과 몇 개의 변수 추가로는 0.0015 ~ 6 정도로 차이는 없었음) 이 참에 겸사겸사 boost::pool 을 적용 보았습니다. 전 버전과 틀려진 점은 pool 에서 자동 소멸 기능이 지원되기 때문에 최종적 BYTE* 를 받을 때 스마트 포인터로 안받고 직접적으로 호출을 했다는 점 입니다. 가독성은 떨어지게 됐는데 전 버전과 비교해보면 알 수 있을 겁니다 참고 사이트 : http://www.boost.org/doc/libs/1_47_0/libs/pool/doc/interfaces.html 참고 예제 소스 - 클레스 #define _BUFF_S.. 2011. 11. 4.
boost::function 으로 callback map 만들기 boost::function 을 이용해서 패킷 인덱스에 반응하여 callback 을 일으키는 방식 좀 더 알면 수작업을 더 줄 일 수 있을 것 같은데 지금은 뭐... 그냥 맛보기 수준인 듯 callback 매니저 #include #include // http://www.boost.org/doc/libs/1_47_0/doc/html/function/tutorial.html#id1361654 /* struct X { int foo(int); }; boost::function f; X x; f = std::bind1st( std::mem_fun(&X::foo), &x); f(5); // Call x.foo(5) */ typedef boost::functionTYPE_FUNCTION; typedef std::m.. 2011. 11. 3.
STL map / multimap map 과 같은 키값에 다른 값들로 이루어진 multimap 에 대한 사용법 예제 map 안에 같은 키값으로 여러개 넣으면 insert 실패가 되어버리므로 그럴 때는 multimap 을 활용한다 소스 예제 void foo() { // 맵 std::map mapTemp; mapTemp.insert(std::map::value_type(2011, 11)); // 반복자 std::map::const_iterator it; for(it = mapTemp.begin(); it != mapTemp.end(); it++) if(it->first == 2011) int nVal = it->second;// nVal == 11 // 검색 std::map::iterator it = mapTemp.find(2011); if.. 2011. 11. 3.
char* / char[] 공백문자 제거 tchar 와 char 간 문자열 인식 문제 때문에 필요하게 될 것이다~ 긴 말 필요 없고 소스로 더 간단한건 std::string 으로 바꾸고 맨 뒤를 erase 로 날려버려도 된다 ㅋ #include // isspace() #include // strcpy_s() strlen() #define MAX_STR_LEN 4000 char* trim(char *s); // 문자열 좌우 공백 모두 삭제 함수 char* ltrim(char *s); // 문자열 좌측 공백 제거 함수 char* rtrim(char* s); // 문자열 우측 공백 제거 함수 // 문자열 우측 공백문자 삭제 함수 char* rtrim(char* s) { char t[MAX_STR_LEN]; char *end; // Visual C 2.. 2011. 11. 2.
STL vector, list, map 반복자 도중 삭제 사실 map 같은 건 좀 덜 하지만 (key 값으로 찾아 원하는것만 삭제 할 수 있으니...) vector 나 list 같은 경우엔 어떤 조건을 충족해야 삭제를 해야만 하는 경우가 있다. 그래서 보통 반복자를 통해서 삭제를 하는데 무작정 하다가는 프로그램이 뻗어버리는 경우가 일어난다 그래서 안전하게 삭제하는 흔하디 흔한 방법을 남겨둔다 Container::iterator it = Container.begin(); for( ; it != Container.end(); ) { if() { it = Container.erase(it); continue; } ++it; } 2011. 11. 2.
BYTE (unsigned char) Stream / asio send buffer 데이터를 주고 받을 때 암호화/복호화에 용의한 BYTE 형의 Stream 제어 클레스를 만들어 보았습니다 std::copy() 가 주석이고 stdext::unchecked_copy() 를 쓰는 것을 볼 수 있는데 copy() 로 쓰면 위험성이 있습니다 그래서 권장이 unchecked_copy() 인데 stdext:: 로 된 것을 잘 보세요! 아마도 vs2008 부터 지원할수도 있습니다 이전 버전에서는 그냥 copy 로 쓰시면 됩니다 사실은 보내는 부분 보다는 받는 부분이 더 걸작인데 ㅎㅎ class 예제 class CByteStream { BYTE* m_pData; int m_nSize; public: BYTE* GetData() { return m_pData; } int size() { return m.. 2011. 11. 1.
boost::asio::buffer http://think-async.com/Asio/boost_asio_1_3_1/doc/html/boost_asio/reference/buffer.html boost::asio::buffer 의 사용법이 잘 나와있는 레퍼런스 페이지 asio service 에서 쓰이는 read write 시 데이터 전송의 좋은 활용 예를 볼 수 있다 Buffers and Scatter-Gather I/O 의 예 char d1[128]; std::vector d2(128); boost::array d3; boost::array bufs1 = { boost::asio::buffer(d1), boost::asio::buffer(d2), boost::asio::buffer(d3) }; bytes_transferred = sock.. 2011. 10. 28.
boost::asio 비동기 TCP + echo 서버 / 클라이언트 asio 라이브러리를 이용해 비동기 TCP 서버와 클라이언트를 만들어 봤습니다 예제에 있는거 그대로 이용을 했으니 뭐 특별할건 없고 컴파일 옵션에서 /Mtd 와 클라 소스에서 MY_IP 부분 수정이 필요합니다 # 소스 퍼가실 때 소스 부분을 더블클릭하면 선택 됩니다 드래그 하면 라인 정리가 안되니까 더블클릭으로 선택하고 카피하세요 # 소스에 대한 더 좋은 의견이나 개선사항은 비밀덧글로 주세요 ^^ # 소스 퍼가실 때 한마디 남겨주시면 힘이 됩니다 @_@ 서버 소스 #include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include.. 2011. 10. 27.
boost::asio 쓰레드, 타이머, Strand 의 사용법 예제 asio io 를 쓰레드에 태워서 서버용 프로그램을 드래그 하더라도 멈추지 않게끔 된다 쓰레드에서 도는 두개의 타이머와 공유되는 변수를 통해 threadsafe 함을 보이고 strand 로 callback 을 관리하는 것을 볼 수 있다 예제 코드 #include "stdafx.h" #include #include #include class job { private: boost::asio::strand strand_; boost::asio::deadline_timer timer1_; boost::asio::deadline_timer timer2_; int co.. 2011. 10. 27.
boost::asio boost 라이브러리의 한 사이드로 TCP, UDP 의 io 지원을 해준다. 한번쯤 보면 좋을 듯. 웹에서 찾다보면 흔히 볼 수 있는 asio 의 메뉴얼을 번역해놓은 문서다 메뉴얼에는 asio 를 쓰다보면 필히 접게하 되는 자주 쓰이는 스킬과 본격적인 소켓 사용의 방법이 나온다 - 동기/비동기적 타이머 사용 - 인자를 핸들러에 바인딩 - 맴버함수를 핸들러에 바인딩 - 멀티스레드 환경에서 핸들러 동기화 - 동기/비동기적인 TCP/UDP 서버의 예제 - 위 서버에 상응하는 클라이언트 예제 진자 필요한거만 잘도 추려놨다. 이게 뭐야? 하고 한번씩 실행시켜보고 지나갔다 나중에 본격적으로 쓸때 아.. 그게 있어야 되는구나.. 돌이켜보게 된다. 2011. 10. 27.
boost 라이브러리 이미 오래전부터 아는 사람들 사이에서는 좋다고 소문난 라이브러리. vs2008 부터는 아예 표준으로 합류했다 tr1 라이브러리로 boost 라이브러리 설치형으로 다운로드 http://www.boostpro.com/download/ 설치 설명 참고하면 괜찮은 블로그 http://blog.daum.net/aswip/8429308 2011. 10. 27.
boost::lockfree 설치 및 사용법 Lock Free 가 적용된 FIFO, Stack, Ringbuffer(Queue) 를 지원해준다 부스터 설치 폴더에 boost 의 내용 (폴더와 hpp 파일들인데 폴더는 그냥 덮어쓰면 되고 hpp 는 최신 버전인지 비교를 해보고 덮어써야 안전) 과 Libs 를 카피해넣기만 하면 된다. 자세한 사용법이나 내용은 제작자 Tim 씨의 사이트에서 확인! boost::lockfree 다운로드는 아래에~ 자.. 사용법을 보자.. 삭제 자체는 스마트 포인터기 때문에 별도 관리가 없어도 된다 #include struct SData { }; class CMyClass { private: boost::lockfree::fifo m_Fifo; public: void Add(SData temp) { m_Fifo.enqueu.. 2011. 10. 24.
소스코드 인용구 테스트 &lt; < 어떻게 하는걸까요 -_-;;;;;;;;;; 너무 어려운데... http://nnoco.tistory.com/26 를 참조하면 쉬울 듯 int _tmain(int argc, char* argv[]) { try { // io_service를 하나 생성한다. boost::asio::io_service io_service; // 접속 시도 CProtocol Ptc(io_service); boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); Ptc.Connect(); boost::thread Recv(boost::bind(&CProtocol::handle_Recive, &Ptc)); boost::thread Send(boost::b.. 2011. 10. 24.