RawCircleBuff.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #pragma once
  2. #include <map>
  3. #include <vector>
  4. #include <string>
  5. #include "MsgQueue.h"
  6. #include "DiosLock.h"
  7. using namespace std;
  8. #define LOW_REQUEST_SIZE (-1)
  9. class Packet_CB
  10. {
  11. public:
  12. Packet_CB()
  13. {
  14. m_Offset = 0;
  15. m_PacketSize = 0;
  16. };
  17. Packet_CB(DWORD offset,DWORD size)
  18. {
  19. m_PacketSize = size;
  20. m_Offset = offset;
  21. };
  22. ~Packet_CB()
  23. {
  24. };
  25. DWORD m_PacketSize;
  26. DWORD m_Offset;
  27. };
  28. class CircleBuff : public DiosLock
  29. {
  30. protected:
  31. char *m_pBuff;
  32. DWORD m_TotalSize;
  33. DWORD m_UsedSize;
  34. DWORD m_BasePos;
  35. DWORD m_HeadPos;
  36. DWORD m_Limit;
  37. MsgQueue<Packet_CB> m_PacketQue;
  38. DWORD PushBlock(const char *pContext, DWORD Size);
  39. public:
  40. CircleBuff();
  41. virtual ~CircleBuff();
  42. //初期设置,后续Push中有自动调整
  43. bool ReSetBuffSize(DWORD Size);
  44. //可能需要设置BUFF最大Limit,不然有可能内存吃冒了.
  45. void SetBuffMaxLimit(DWORD limit);//缺省32M在构造中
  46. //压入一个包,RAW+Size
  47. //返回压入包的大小,返回0:要么是Size零,要么是没内存了.
  48. DWORD Push(const char *pContext, DWORD Size);
  49. //读一个包,RAW+Size
  50. //返回包的大小,返回0意味着无包,返回-1意味着读包缓存太小
  51. int Pop(char *pContext, DWORD ContextSize);
  52. DWORD GetPacketCount();//读取剩余包的个数
  53. DWORD GetFrontPacketSize();//读取要Pop的包大小,返回0:无包
  54. //int CopyTransfer(CircleBuff &org);//copy org -> this.返回复制个数,负数返回失败
  55. HANDLE GetNotifyHandle();
  56. };