Error

C++博客 首页 新随笔 联系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
应为协议都是遵循:len type data这样的结构,所以打包发送和接收解包可以有通用的做法,,,
 
//////////////////////////////////////////////////////////////////////////

//数据描述头
struct tagDataDescribe
{
    WORD                            wDataSize;                        
//数据大小
    WORD                            wDataDescribe;                    //数据描述
};

//////////////////////////////////////////////////////////////////////////

//数据包辅助类(多包组合成一包)
class CSendPacketHelper
{
    
//变量定义
protected:
    WORD                                m_wDataSize;                    
//数据大小
    WORD                                m_wBufferSize;                    //缓冲大小
    BYTE                                * m_pcbBuffer;                    //缓冲指针

    
//函数定义
public:
    
//构造函数
    CSendPacketHelper(void * pcbBuffer, WORD wBufferSize)
    {
        m_wDataSize
=0;
        m_wBufferSize
=wBufferSize;
        m_pcbBuffer
=(BYTE *)pcbBuffer;
    }
    
//析构函数
    virtual ~CSendPacketHelper() {}

    
//功能函数
public:
    
//清理数据
    void CleanData() { m_wDataSize=0; }
    
//获取大小
    WORD GetDataSize() { return m_wDataSize; }
    
//获取缓冲
    void * GetDataBuffer() { return m_pcbBuffer; }
    
//插入数据(如果缓冲区长度不够返回false)
    
// wDataSize, wDataType 实际上就是DataDescribe
    bool AddPacket(void * pData, WORD wDataSize, WORD wDataType)
    {
        
//效验大小
        ASSERT((wDataSize+sizeof(tagDataDescribe)+m_wDataSize)<=m_wBufferSize);
        
if ((wDataSize+sizeof(tagDataDescribe)+m_wDataSize)>m_wBufferSize) return false;

        
//插入数据
        ASSERT(m_pcbBuffer!=NULL);
        tagDataDescribe 
* pDataDescribe=(tagDataDescribe *)(m_pcbBuffer+m_wDataSize);
        pDataDescribe
->wDataSize=wDataSize;
        pDataDescribe
->wDataDescribe=wDataType;

        
//插入数据
        if (wDataSize>0)
        {
            ASSERT(pData
!=NULL);
            CopyMemory(pDataDescribe
+1,pData,wDataSize);
        }

        
//设置数据
        m_wDataSize+=sizeof(tagDataDescribe)+wDataSize;
    
        
return true;
    }
};

/////////////////////////////////////////////////////////////////////////////////////////

//数据包辅助类
class CRecvPacketHelper
{
    
//变量定义
protected:
    WORD                                m_wDataPos;                        
//数据点
    WORD                                m_wDataSize;                    //数据大小
    BYTE                                * m_pcbBuffer;                    //缓冲指针

    
//函数定义
public:
    
//构造函数
    CRecvPacketHelper(LPCVOID pcbBuffer, WORD wDataSize)
    {
        m_wDataPos
=0;
        m_wDataSize
=wDataSize;
        m_pcbBuffer
=(BYTE *)pcbBuffer;
    }
    
//析构函数
    virtual ~CRecvPacketHelper() {}

    
//功能函数
public:
    
//获取数据(返回一包数据)
    
// @DataDescribe:数据描述(len type)
    
// @return: 数据
    void * GetData(tagDataDescribe & DataDescribe)
    {
        
//效验数据
        if (m_wDataPos>=m_wDataSize) 
        {
            ASSERT(m_wDataPos
==m_wDataSize);
            DataDescribe.wDataSize
=0;
            DataDescribe.wDataDescribe
=DTP_NULL;
            
return NULL;
        }

        
//获取数据
        ASSERT((m_wDataPos+sizeof(tagDataDescribe))<=m_wDataSize);
        CopyMemory(
&DataDescribe,m_pcbBuffer+m_wDataPos,sizeof(tagDataDescribe));
        ASSERT((m_wDataPos
+sizeof(tagDataDescribe)+DataDescribe.wDataSize)<=m_wDataSize);

        
//效验数据
        if ((m_wDataPos+sizeof(tagDataDescribe)+DataDescribe.wDataSize)>m_wDataSize)
        {
            DataDescribe.wDataSize
=0;
            DataDescribe.wDataDescribe
=DTP_NULL;
            
return NULL;
        }

        
//设置数据
        void * pData=NULL;
        
if (DataDescribe.wDataSize>0) pData=m_pcbBuffer+m_wDataPos+sizeof(tagDataDescribe);
        m_wDataPos
+=sizeof(tagDataDescribe)+DataDescribe.wDataSize;
        
return pData;
    };
};
posted on 2011-07-04 10:50 Enic 阅读(1403) 评论(0)  编辑 收藏 引用 所属分类: 网狐棋牌源码分析

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理