zbuffer.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifdef ZBUFFER_H
  2. #define ZBUFFER_H
  3. #include "zport.h"
  4. #define MINIMIZE_BLOCK_SIZE 16 //16字节对齐,最小的块大小为16字节
  5. #define STATE_FREE 0 //未使用状态
  6. #define STATE_IDLE 1 //已经分配没有数据状态
  7. #define STATE_RECEIVING 2 //正在接收数据
  8. #define STATE_WAITING 3 //等待应用程序取走数据
  9. #define STATE_PACKING 4 //正在打包数据
  10. #define STATE_SENDING 5 //正在发送
  11. typedef struct {
  12. // is it should be 2 bytes? 
  13. unsigned long  size; //数据包的大小(包括对齐的字节)
  14. unsigned short data_size; //实际数据的大小
  15. unsigned short current_size; //当前大小(发送或者接收过程中)
  16. unsigned short  state; //当前状态
  17. unsigned short  reserved; //保留
  18. long next; //下一数据包(偏移量)
  19. } packet_info;
  20. //数据包在缓冲区中的定义
  21. #define CONNECTION_FREE 0 //连接没有使用
  22. #define CONNECTION_USED 1 //连接已经使用
  23. //连接的基本信息
  24. class connection_info
  25. {
  26. public:
  27. short state; //连接的状态
  28. unsigned short halfword; //边界处理 [wxb 2003-8-5]
  29. long head_offset; //头数据包在缓冲区中的偏移量,-1表示没有数据
  30. long tail_offset; //尾数据包在缓冲区中的偏移量,-1表示没有数据
  31. long used_bufsize; //所占用的缓冲区字节数
  32. unsigned long packet_time; //上次数据包的接收时间
  33. connection_info() { reset(); }
  34. void reset()
  35. {
  36. state = CONNECTION_FREE;
  37. head_offset = tail_offset = -1;
  38. packet_time = 0;
  39. halfword = 0;
  40. used_bufsize = 0;
  41. }
  42. };
  43. //进行性能统计的类
  44. class ZPerf {
  45. public:
  46. unsigned long packet_number; //发送/接收的数据包总数
  47. unsigned long remain_number; //当前仍然在缓冲区的数目
  48. int max_interval; //包之间的最大时间间隔
  49. int min_interval; //包之间的最小时间间隔
  50. unsigned long tick_count; //开始的时间
  51. short max_size; //包的最大大小
  52. short min_size; //包的最小大小
  53. unsigned long total_size; //总大小
  54. unsigned long remain_size; 
  55. ZPerf();
  56. void start();
  57. void stop();
  58. void perfPacket(int size, connection_info *connection);
  59. void useBuffer(int size, connection_info *connection);
  60. void freeBuffer(int size, connection_info *connection);
  61. };
  62. class ZBuffer {
  63. public:
  64. char *buffer; //实际的缓冲区
  65. packet_info *free_packet; //空闲块
  66. long buffer_size; //缓冲区的大小
  67. connection_info *connections; //连接的列表
  68. int max_connection; //最大连接数
  69. ZMutex mutex;
  70. char **recv_buffers; //等待处理的收取数据
  71. int *recv_buffer_size;
  72. protected:
  73. //得到一个空闲的数据块,将这个数据块放到指定索引的空闲节点链表最后
  74. bool inline getNode(int index, int size);
  75. char *getRecvBuffer(int index, int size)
  76. {
  77. #define MIN_RECV_BUF_SIZE 1024
  78. if (recv_buffer_size[index] >= size)
  79. return recv_buffers[index];
  80. //realloc
  81. if (recv_buffers[index])
  82. delete recv_buffers[index];
  83. recv_buffer_size[index] = MIN_RECV_BUF_SIZE > size ? MIN_RECV_BUF_SIZE : size;
  84. recv_buffers[index] = new char[recv_buffer_size[index]];
  85. return recv_buffers[index];
  86. }
  87. public:
  88. //下面是一些统计数据
  89. bool bPerf;
  90. ZPerf send_perf; //发送性能统计
  91. ZPerf receive_perf; //接收性能统计
  92. ZBuffer(long size, int number);
  93. virtual ~ZBuffer();
  94. //下面是对外提供的接口
  95. void stopPerf() {
  96. bPerf = false;
  97. send_perf.stop();
  98. receive_perf.stop();
  99. }
  100. void startPerf() {
  101. bPerf = true;
  102. send_perf.start();
  103. receive_perf.start();
  104. }
  105. void clear(int index, bool bSendOrRecv); //清除指定连接的所有数据
  106. long getUsedBufferSize(int index); //获取指定连接所占用的缓冲区大小
  107. int  getConnection(); //获得一个没有使用的连接
  108. bool receiveData(int index, const char *data, int size);
  109. char *getPacket(int index, int &size);
  110. //发送数据的接口分成两个函数,一个是获取当前发送的缓冲区和长度,另外一个是从缓冲区清除指定大小的数据
  111. char *getSendData(int index, int &size);
  112. void sendData(int index, int size);
  113. bool packData(int index, const char *data, int size);
  114. char *sendPacket(int index, int &datalength);
  115. };
  116. #define MAX_PACKET_SIZE 1024 //最大的包大小
  117. #endif