應(yīng)為協(xié)議都是遵循:len type data這樣的結(jié)構(gòu),所以打包發(fā)送和接收解包可以有通用的做法,,,
//////////////////////////////////////////////////////////////////////////
//數(shù)據(jù)描述頭
struct tagDataDescribe
{
WORD wDataSize; //數(shù)據(jù)大小
WORD wDataDescribe; //數(shù)據(jù)描述
};
//////////////////////////////////////////////////////////////////////////
//數(shù)據(jù)包輔助類(多包組合成一包)
class CSendPacketHelper
{
//變量定義
protected:
WORD m_wDataSize; //數(shù)據(jù)大小
WORD m_wBufferSize; //緩沖大小
BYTE * m_pcbBuffer; //緩沖指針
//函數(shù)定義
public:
//構(gòu)造函數(shù)
CSendPacketHelper(void * pcbBuffer, WORD wBufferSize)
{
m_wDataSize=0;
m_wBufferSize=wBufferSize;
m_pcbBuffer=(BYTE *)pcbBuffer;
}
//析構(gòu)函數(shù)
virtual ~CSendPacketHelper() {}
//功能函數(shù)
public:
//清理數(shù)據(jù)
void CleanData() { m_wDataSize=0; }
//獲取大小
WORD GetDataSize() { return m_wDataSize; }
//獲取緩沖
void * GetDataBuffer() { return m_pcbBuffer; }
//插入數(shù)據(jù)(如果緩沖區(qū)長(zhǎng)度不夠返回false)
// wDataSize, wDataType 實(shí)際上就是DataDescribe
bool AddPacket(void * pData, WORD wDataSize, WORD wDataType)
{
//效驗(yàn)大小
ASSERT((wDataSize+sizeof(tagDataDescribe)+m_wDataSize)<=m_wBufferSize);
if ((wDataSize+sizeof(tagDataDescribe)+m_wDataSize)>m_wBufferSize) return false;
//插入數(shù)據(jù)
ASSERT(m_pcbBuffer!=NULL);
tagDataDescribe * pDataDescribe=(tagDataDescribe *)(m_pcbBuffer+m_wDataSize);
pDataDescribe->wDataSize=wDataSize;
pDataDescribe->wDataDescribe=wDataType;
//插入數(shù)據(jù)
if (wDataSize>0)
{
ASSERT(pData!=NULL);
CopyMemory(pDataDescribe+1,pData,wDataSize);
}
//設(shè)置數(shù)據(jù)
m_wDataSize+=sizeof(tagDataDescribe)+wDataSize;
return true;
}
};
/////////////////////////////////////////////////////////////////////////////////////////
//數(shù)據(jù)包輔助類
class CRecvPacketHelper
{
//變量定義
protected:
WORD m_wDataPos; //數(shù)據(jù)點(diǎn)
WORD m_wDataSize; //數(shù)據(jù)大小
BYTE * m_pcbBuffer; //緩沖指針
//函數(shù)定義
public:
//構(gòu)造函數(shù)
CRecvPacketHelper(LPCVOID pcbBuffer, WORD wDataSize)
{
m_wDataPos=0;
m_wDataSize=wDataSize;
m_pcbBuffer=(BYTE *)pcbBuffer;
}
//析構(gòu)函數(shù)
virtual ~CRecvPacketHelper() {}
//功能函數(shù)
public:
//獲取數(shù)據(jù)(返回一包數(shù)據(jù))
// @DataDescribe:數(shù)據(jù)描述(len type)
// @return: 數(shù)據(jù)
void * GetData(tagDataDescribe & DataDescribe)
{
//效驗(yàn)數(shù)據(jù)
if (m_wDataPos>=m_wDataSize)
{
ASSERT(m_wDataPos==m_wDataSize);
DataDescribe.wDataSize=0;
DataDescribe.wDataDescribe=DTP_NULL;
return NULL;
}
//獲取數(shù)據(jù)
ASSERT((m_wDataPos+sizeof(tagDataDescribe))<=m_wDataSize);
CopyMemory(&DataDescribe,m_pcbBuffer+m_wDataPos,sizeof(tagDataDescribe));
ASSERT((m_wDataPos+sizeof(tagDataDescribe)+DataDescribe.wDataSize)<=m_wDataSize);
//效驗(yàn)數(shù)據(jù)
if ((m_wDataPos+sizeof(tagDataDescribe)+DataDescribe.wDataSize)>m_wDataSize)
{
DataDescribe.wDataSize=0;
DataDescribe.wDataDescribe=DTP_NULL;
return NULL;
}
//設(shè)置數(shù)據(jù)
void * pData=NULL;
if (DataDescribe.wDataSize>0) pData=m_pcbBuffer+m_wDataPos+sizeof(tagDataDescribe);
m_wDataPos+=sizeof(tagDataDescribe)+DataDescribe.wDataSize;
return pData;
};
};