#pragma once #include #include #include #include "MsgQueue.h" #include "DiosLock.h" using namespace std; #define LOW_REQUEST_SIZE (-1) class Packet_CB { public: Packet_CB() { m_Offset = 0; m_PacketSize = 0; }; Packet_CB(DWORD offset,DWORD size) { m_PacketSize = size; m_Offset = offset; }; ~Packet_CB() { }; DWORD m_PacketSize; DWORD m_Offset; }; class CircleBuff : public DiosLock { protected: char *m_pBuff; DWORD m_TotalSize; DWORD m_UsedSize; DWORD m_BasePos; DWORD m_HeadPos; DWORD m_Limit; MsgQueue m_PacketQue; DWORD PushBlock(const char *pContext, DWORD Size); public: CircleBuff(); virtual ~CircleBuff(); //初期设置,后续Push中有自动调整 bool ReSetBuffSize(DWORD Size); //可能需要设置BUFF最大Limit,不然有可能内存吃冒了. void SetBuffMaxLimit(DWORD limit);//缺省32M在构造中 //压入一个包,RAW+Size //返回压入包的大小,返回0:要么是Size零,要么是没内存了. DWORD Push(const char *pContext, DWORD Size); //读一个包,RAW+Size //返回包的大小,返回0意味着无包,返回-1意味着读包缓存太小 int Pop(char *pContext, DWORD ContextSize); DWORD GetPacketCount();//读取剩余包的个数 DWORD GetFrontPacketSize();//读取要Pop的包大小,返回0:无包 //int CopyTransfer(CircleBuff &org);//copy org -> this.返回复制个数,负数返回失败 HANDLE GetNotifyHandle(); };