728x90
boost::function 을 이용해서 패킷 인덱스에 반응하여 callback 을 일으키는 방식
좀 더 알면 수작업을 더 줄 일 수 있을 것 같은데 지금은 뭐... 그냥 맛보기 수준인 듯
callback 매니저
#include <map> #include <boost/function.hpp> // http://www.boost.org/doc/libs/1_47_0/doc/html/function/tutorial.html#id1361654 /* struct X { int foo(int); }; boost::function<int (int)> f; X x; f = std::bind1st( std::mem_fun(&X::foo), &x); f(5); // Call x.foo(5) */ typedef boost::function<BYTE* (BYTE*)> TYPE_FUNCTION; typedef std::map< int, TYPE_FUNCTION > TYPE_CALLBACK_MAP; class CCallback { public: void Run(BYTE* pData) { } }; class CCBSample : public CCallback { public: virtual BYTE* Run(BYTE* pData) { if(pData == NULL) return NULL; // data stream 처리 return NULL; } }; enum ePacketIndex { eNone = 0, eSample, }; class CCallbackMrg { TYPE_CALLBACK_MAP m_mapCallback; CCBSample m_CBSample; public: void Insert(int nKey, TYPE_FUNCTION f) { m_mapCallback.insert(TYPE_CALLBACK_MAP::value_type(nKey, f) ); } BYTE* Do(int nKey, BYTE* pData) { TYPE_CALLBACK_MAP::const_iterator it; it = m_mapCallback.find(nKey); if(it != m_mapCallback.end()) { TYPE_FUNCTION f = it->second; return f(pData); } return NULL; } void Init() { Insert((int)eSample, std::bind1st(std::mem_fun(&CCBSample::Run), &m_CBSample)); } };
실 사용 예제
void handle_Send(const boost::system::error_code& error, size_t /*bytes_transferred*/) { if(!error) // 0 이 성공 나머지는 오류 플러그 { if(m_RecvBuf.size()) { int n = (*(int*)(m_RecvBuf.data())); m_CBSample.Do(n, m_RecvBuf.data()); } } // ... }
728x90
'프로그래밍 > boost' 카테고리의 다른 글
ByteStream / CallbackMrg (0) | 2011.11.05 |
---|---|
BYTE (unsigned char) Stream 에 boost::pool 적용 (3) | 2011.11.04 |
boost::asio::buffer (0) | 2011.10.28 |
boost::asio 비동기 TCP + echo 서버 / 클라이언트 (6) | 2011.10.27 |
boost::asio 쓰레드, 타이머, Strand 의 사용법 예제 (0) | 2011.10.27 |
댓글