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 |
댓글