• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Error

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
            應(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;
                };
            };
            posted on 2011-07-04 10:50 Enic 閱讀(1482) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)狐棋牌源碼分析
            亚洲国产成人精品91久久久 | 久久久中文字幕| 久久久久亚洲AV成人网人人网站 | 国产V亚洲V天堂无码久久久| 久久伊人精品一区二区三区| 亚洲精品乱码久久久久久蜜桃| 很黄很污的网站久久mimi色 | 一本久久精品一区二区| 久久国产免费直播| 久久精品成人| 热久久国产欧美一区二区精品| 久久成人精品| 青春久久| 亚洲综合熟女久久久30p| 国产成人精品综合久久久| 亚洲中文字幕无码久久2020| 精品久久人人爽天天玩人人妻| 久久精品国产免费观看三人同眠| 久久国产欧美日韩精品| 久久久久亚洲精品天堂| 久久福利青草精品资源站免费| 伊人久久免费视频| 伊人久久成人成综合网222| 久久人人爽人人爽人人片av麻烦| 亚洲AV无码1区2区久久| 久久精品国产91久久麻豆自制| 国产AⅤ精品一区二区三区久久| 久久综合久久性久99毛片| 精品久久亚洲中文无码| 国产精品久久久久久一区二区三区| 欧美777精品久久久久网| 久久亚洲国产精品123区| 亚洲第一极品精品无码久久| www.久久热| 久久人人爽人人精品视频| 人人狠狠综合久久88成人| 91精品婷婷国产综合久久 | 伊人久久大香线焦AV综合影院| 久久久免费精品re6| 国产午夜久久影院| 天天做夜夜做久久做狠狠|