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

模拟服务器

开发平台:

C/C++

  1. #ifndef XBUFFER_H
  2. #define XBUFFER_H
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "zport.h"
  6. #define MINIMIZE_BLOCK 32 //最小块大小为32字节
  7. class ZBuffer {
  8. ZMutex mutex;
  9. char *send_buffer; //实际使用的发送缓冲区
  10. char *receive_buffer; //实际使用的接收缓冲区
  11. long max_send; //发送缓冲区的大小
  12. long max_receive; //接收缓冲区的大小
  13. //下面是一些统计数据
  14. bool bPerf;
  15. // ZPerf send_perf; //发送性能统计
  16. // ZPerf receive_perf; //接收性能统计
  17. char *receive_ptr; //当前接收数据的指针
  18. long receive_size; //接收数据的大小
  19. char *send_ptr; //当前发送数据的指针
  20. long send_size; //发送数据的大小
  21. char *packet_ptr; //当前数据包的开始指针
  22. unsigned short packet_size; //当前数据包的大小
  23. char *recv_buffer; //等待处理的收取数据
  24. int recv_buffer_size;
  25. char *getRecvBuf(int size)
  26. {
  27. #define MIN_RECV_BUF_SIZE 1080
  28. if (recv_buffer_size >= size)
  29. return recv_buffer;
  30. //realloc
  31. if (recv_buffer)
  32. delete recv_buffer;
  33. recv_buffer_size = MIN_RECV_BUF_SIZE > size ? MIN_RECV_BUF_SIZE : size;
  34. recv_buffer = new char[recv_buffer_size];
  35. return recv_buffer;
  36. }
  37. public:
  38. ZBuffer(long the_max_send, long the_max_receive) {
  39. send_buffer = new char[the_max_send];
  40. if(send_buffer) max_send = the_max_send;
  41. else max_send = 0;
  42. receive_buffer = new char[the_max_receive];
  43. if(receive_buffer) max_receive = the_max_receive;
  44. else max_receive = 0;
  45. recv_buffer = 0;
  46. recv_buffer_size = 0;
  47. clear();
  48. }
  49. virtual ~ZBuffer() {
  50. if(send_buffer) delete[] send_buffer;
  51. if(receive_buffer) delete[] receive_buffer;
  52. if(recv_buffer) delete[] recv_buffer;
  53. }
  54. //下面是对外提供的接口
  55. void stopPerf() {
  56. bPerf = false;
  57. // send_perf.stop();
  58. // receive_perf.stop();
  59. }
  60. void startPerf() {
  61. bPerf = true;
  62. // send_perf.start();
  63. // receive_perf.start();
  64. }
  65. //获取可用的接收数据的缓冲区
  66. char *getReceiveBuffer(int &size) {
  67. mutex.lock();
  68. if(receive_size + MINIMIZE_BLOCK > max_receive) {
  69. //超出最大缓冲区,关闭连接
  70. mutex.unlock();
  71. return NULL;
  72. }
  73. if(receive_ptr + receive_size + MINIMIZE_BLOCK > receive_buffer + max_receive) { //尾部数据不够了
  74. memmove(receive_buffer, receive_ptr, receive_size);
  75. receive_ptr = receive_buffer;
  76. }
  77. size = max_receive - (receive_ptr - receive_buffer) - receive_size;
  78. mutex.unlock();
  79. return receive_ptr + receive_size;
  80. }
  81. void receiveData(int size) {
  82. mutex.lock();
  83. receive_size += size;
  84. //printf("receive data %d(%d) n", receive_size, *(short *)(receive_ptr + receive_size - size));
  85. mutex.unlock();
  86. }
  87. const char *getPacket(int &size) {
  88. if(receive_size < sizeof(unsigned short)) return NULL;
  89. mutex.lock();
  90. size = *(unsigned short *)receive_ptr;
  91. if(receive_size >= size) {
  92. const char *result = (const char *)receive_ptr + sizeof(unsigned short);
  93. receive_ptr += size;
  94. receive_size -= size;
  95. // printf("receive data %dn", receive_size);
  96. size -= sizeof(unsigned short);
  97. mutex.unlock();
  98. char* recvbuf = getRecvBuf(size);
  99. memcpy(recvbuf, result, size);
  100. return recvbuf;
  101. }
  102. mutex.unlock();
  103. return NULL;
  104. }
  105. void clear() {
  106. mutex.lock();
  107. receive_ptr = receive_buffer;
  108. receive_size = 0;
  109. packet_ptr = send_ptr = send_buffer;
  110. *(unsigned short *)send_ptr = 0;
  111. send_size = 0;
  112. packet_size = 0;
  113. mutex.unlock();
  114. }
  115. //发送数据的接口分成两个函数,一个是获取当前发送的缓冲区和长度,另外一个是从缓冲区清除指定大小的数据
  116. char *getSendData(int &size) {
  117. mutex.lock();
  118. size = packet_ptr - send_ptr;
  119. if(size) {
  120. mutex.unlock();
  121. return send_ptr;
  122. }
  123. else {
  124. mutex.unlock();
  125. return NULL;
  126. }
  127. }
  128. void sendData(int size) {
  129. mutex.lock();
  130. send_ptr += size;
  131. send_size -= size;
  132. if(!send_size) {
  133. send_ptr = packet_ptr = send_buffer;
  134. *(unsigned short *)send_ptr = 0;
  135. }
  136. mutex.unlock();
  137. }
  138. bool packData(const char *data, int size) {
  139. mutex.lock();
  140. if(send_size + size + MINIMIZE_BLOCK >= max_send) {
  141. //缓冲区满,关闭连接
  142. mutex.unlock();
  143. return false;
  144. }
  145. if(!packet_size) {
  146. *(unsigned short *)packet_ptr = 0;
  147. packet_size += sizeof(unsigned short);
  148. send_size += sizeof(unsigned short);
  149. }
  150. if(packet_ptr + packet_size + size + MINIMIZE_BLOCK >= send_buffer + max_send) { //尾部的空间不够了
  151. memmove(send_buffer, send_ptr, send_size);
  152. packet_ptr -= (send_ptr - send_buffer);
  153. send_ptr = send_buffer;
  154. }
  155. memcpy(packet_ptr + packet_size, data, size);
  156. packet_size += size;
  157. send_size += size;
  158. mutex.unlock();
  159. return true;
  160. }
  161. char *completePacket(int &datalength) {
  162. mutex.lock();
  163. if(!packet_size) {
  164. mutex.unlock();
  165. return NULL;
  166. }
  167. datalength = packet_size - sizeof(unsigned short);
  168. mutex.unlock();
  169. return packet_ptr + sizeof(unsigned short);
  170. }
  171. void sendPacket() { //完成一个数据包
  172. if (!packet_size)
  173. return;
  174. mutex.lock();
  175. *(unsigned short *)packet_ptr = packet_size;
  176. packet_ptr += packet_size;
  177. packet_size = 0;
  178. mutex.unlock();
  179. }
  180. };
  181. #endif