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

模拟服务器

开发平台:

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. //进行性能统计的类
  8. class ZPerf {
  9. public:
  10. unsigned long packet_number; //发送/接收的数据包总数
  11. unsigned long remain_number; //当前仍然在缓冲区的数目
  12. int max_interval; //包之间的最大时间间隔
  13. int min_interval; //包之间的最小时间间隔
  14. unsigned long tick_count; //开始的时间
  15. short max_size; //包的最大大小
  16. short min_size; //包的最小大小
  17. unsigned long total_size; //总大小
  18. unsigned long remain_size; 
  19. ZPerf();
  20. void start();
  21. void stop();
  22. void perfPacket(int size);
  23. void useBuffer(int size);
  24. void freeBuffer(int size);
  25. };
  26. class ZBuffer {
  27. char *send_buffer; //实际使用的发送缓冲区
  28. char *receive_buffer; //实际使用的接收缓冲区
  29. long max_send; //发送缓冲区的大小
  30. long max_receive; //接收缓冲区的大小
  31. char *receive_ptr; //当前接收数据的指针
  32. long receive_size; //接收数据的大小
  33. char *send_ptr; //当前发送数据的指针
  34. long send_size; //发送数据的大小
  35. char *packet_ptr; //当前数据包的开始指针
  36. unsigned short packet_size; //当前数据包的大小
  37. //char *recv_buffer; //等待处理的收取数据
  38. //int recv_buffer_size;
  39. // char *pack_buffer;
  40. // int pack_buffer_size;
  41. ZPerf* pRecvPerf;
  42. ZPerf* pSendPerf;
  43. /* char *getRecvBuf(int size)
  44. {
  45. #define MIN_RECV_BUF_SIZE 1024
  46. if (recv_buffer_size >= size)
  47. return recv_buffer;
  48. //realloc
  49. if (recv_buffer)
  50. {
  51. if (pRecvPerf)
  52. pRecvPerf->freeBuffer(recv_buffer_size);
  53. delete recv_buffer;
  54. }
  55. recv_buffer_size = MIN_RECV_BUF_SIZE > size ? MIN_RECV_BUF_SIZE : ((size - 1) / MIN_RECV_BUF_SIZE + 1) * MIN_RECV_BUF_SIZE;
  56. recv_buffer = new char[recv_buffer_size];
  57. if (pRecvPerf)
  58. pRecvPerf->useBuffer(recv_buffer_size);
  59. return recv_buffer;
  60. }*/
  61. /* char *getPackBuf(int size)
  62. {
  63. #define MIN_PACK_BUF_SIZE 2048
  64. if (pack_buffer_size >= size)
  65. return pack_buffer;
  66. char* oldbuf = pack_buffer;
  67. int oldsize = pack_buffer_size;
  68. pack_buffer_size = MIN_PACK_BUF_SIZE > size ? MIN_PACK_BUF_SIZE : ((size - 1) / MIN_PACK_BUF_SIZE + 1) * MIN_PACK_BUF_SIZE;
  69. pack_buffer = new char[pack_buffer_size];
  70. if (pSendPerf)
  71. pSendPerf->useBuffer(pack_buffer_size);
  72. //realloc
  73. if (oldbuf)
  74. {
  75. memcpy(pack_buffer, oldbuf, oldsize);
  76. if (pSendPerf)
  77. pSendPerf->freeBuffer(oldsize);
  78. delete oldbuf;
  79. }
  80. return pack_buffer;
  81. }*/
  82. public:
  83. ZBuffer(long the_max_send, long the_max_receive) {
  84. pRecvPerf = NULL;
  85. pSendPerf = NULL;
  86. send_buffer = new char[the_max_send];
  87. if(send_buffer) max_send = the_max_send;
  88. else max_send = 0;
  89. receive_buffer = new char[the_max_receive];
  90. if(receive_buffer) max_receive = the_max_receive;
  91. else max_receive = 0;
  92. //recv_buffer = 0;
  93. //recv_buffer_size = 0;
  94. // pack_buffer = 0;
  95. // pack_buffer_size = 0;
  96. if (pRecvPerf)
  97. pRecvPerf->useBuffer(the_max_receive);
  98. if (pSendPerf)
  99. pSendPerf->useBuffer(the_max_send);
  100. clear();
  101. }
  102. virtual ~ZBuffer() {
  103. if(send_buffer) delete[] send_buffer;
  104. if(receive_buffer) delete[] receive_buffer;
  105. //if(recv_buffer) delete[] recv_buffer;
  106. // if(pack_buffer) delete[] pack_buffer;
  107. if (pRecvPerf)
  108. {
  109. //pRecvPerf->freeBuffer(recv_buffer_size);
  110. pRecvPerf->freeBuffer(max_receive);
  111. }
  112. if (pSendPerf)
  113. {
  114. // pSendPerf->freeBuffer(pack_buffer_size);
  115. pSendPerf->freeBuffer(max_send);
  116. }
  117. }
  118. //下面是对外提供的接口
  119. void stopPerf() {
  120. pRecvPerf = NULL;
  121. pSendPerf = NULL;
  122. }
  123. void startPerf(ZPerf* pRP, ZPerf* pSP) {
  124. pRecvPerf = pRP;
  125. pSendPerf = pSP;
  126. }
  127. //获取可用的接收数据的缓冲区
  128. char *getReceiveBuffer(int &size) {
  129. if(receive_size + MINIMIZE_BLOCK > max_receive) {
  130. //超出最大缓冲区,关闭连接
  131. return NULL;
  132. }
  133. if(receive_ptr + receive_size + MINIMIZE_BLOCK > receive_buffer + max_receive) { //尾部数据不够了
  134. memmove(receive_buffer, receive_ptr, receive_size);
  135. receive_ptr = receive_buffer;
  136. }
  137. size = max_receive - (receive_ptr - receive_buffer) - receive_size;
  138. return receive_ptr + receive_size;
  139. }
  140. void receiveData(int size) {
  141. receive_size += size;
  142. if (pRecvPerf)
  143. {
  144. pRecvPerf->perfPacket(size);
  145. pRecvPerf->packet_number++;
  146. }
  147. }
  148. const char *getPacket(int &size) {
  149. if(receive_size < sizeof(unsigned short)) return NULL;
  150. size = *(unsigned short *)receive_ptr;
  151. if (size < sizeof(unsigned short))
  152. {
  153. printf("Unexpected recv buffer reset (size = %d)n", size);
  154. receive_ptr = receive_buffer;
  155. receive_size = 0;
  156. return NULL;
  157. }
  158. if(receive_size >= size) {
  159. const char *result = (const char *)receive_ptr + sizeof(unsigned short);
  160. receive_ptr += size;
  161. receive_size -= size;
  162. size -= sizeof(unsigned short);
  163. //char* recvbuf = getRecvBuf(size);
  164. //memcpy(recvbuf, result, size);
  165. return result;
  166. }
  167. return NULL;
  168. }
  169. void clear() {
  170. receive_ptr = receive_buffer;
  171. receive_size = 0;
  172. packet_ptr = send_ptr = send_buffer;
  173. *(unsigned short *)send_ptr = 0;
  174. send_size = 0;
  175. packet_size = 0;
  176. }
  177. //发送数据的接口分成两个函数,一个是获取当前发送的缓冲区和长度,另外一个是从缓冲区清除指定大小的数据
  178. char *getSendData(int &size) {
  179. size = packet_ptr - send_ptr;
  180. if(size) {
  181. return send_ptr;
  182. }
  183. else {
  184. return NULL;
  185. }
  186. }
  187. void sendData(int size) {
  188. if(size) {
  189. send_ptr += size;
  190. send_size -= size;
  191. if(!send_size) {
  192. send_ptr = packet_ptr = send_buffer;
  193. *(unsigned short *)send_ptr = 0;
  194. }
  195. if (pSendPerf)
  196. pSendPerf->perfPacket(size);
  197. if (pSendPerf)
  198. pSendPerf->packet_number++;
  199. }
  200. }
  201. /* bool packData(const char *data, int size) {
  202. if (packet_size + size >= MIN_PACK_BUF_SIZE * 16) { //最多 32 K
  203. //缓冲区过大,关闭连接
  204. return false;
  205. }
  206. char *pbuf = getPackBuf(packet_size + size);
  207. if(!packet_size) {
  208. *(unsigned short *)pbuf = 0;
  209. packet_size += sizeof(unsigned short);
  210. send_size += sizeof(unsigned short);
  211. }
  212. memcpy(pbuf + packet_size, data, size);
  213. packet_size += size;
  214. send_size += size;
  215. return true;
  216. }
  217. char *completePacket(int &datalength) {
  218. if (!packet_size || packet_size + (packet_ptr - send_ptr) + MINIMIZE_BLOCK >= max_send) {
  219. return NULL;
  220. }
  221. if ((packet_ptr - send_buffer) + packet_size + MINIMIZE_BLOCK >= max_send) //尾部的空间不够了
  222. {
  223. memmove(send_buffer, send_ptr, (packet_ptr - send_ptr));
  224. packet_ptr -= (send_ptr - send_buffer);
  225. send_ptr = send_buffer;
  226. }
  227. memcpy(packet_ptr, pack_buffer, packet_size);
  228. datalength = packet_size - sizeof(unsigned short);
  229. return packet_ptr + sizeof(unsigned short);
  230. }*/
  231. bool packData(const char *data, int size) {
  232. if(send_size + size + MINIMIZE_BLOCK >= max_send) {
  233. //缓冲区满,关闭连接
  234. return false;
  235. }
  236. if(!packet_size) {
  237. *(unsigned short *)packet_ptr = 0;
  238. packet_size += sizeof(unsigned short);
  239. send_size += sizeof(unsigned short);
  240. }
  241. if(packet_ptr + packet_size + size + MINIMIZE_BLOCK >= send_buffer + max_send) { //尾部的空间不够了
  242. memmove(send_buffer, send_ptr, send_size);
  243. packet_ptr -= (send_ptr - send_buffer);
  244. send_ptr = send_buffer;
  245. }
  246. memcpy(packet_ptr + packet_size, data, size);
  247. packet_size += size;
  248. send_size += size;
  249. return true;
  250. }
  251. char *completePacket(int &datalength) {
  252. if(!packet_size) {
  253. return NULL;
  254. }
  255. datalength = packet_size - sizeof(unsigned short);
  256. return packet_ptr + sizeof(unsigned short);
  257. }
  258. void sendPacket() { //完成一个数据包
  259. if (!packet_size)
  260. return;
  261. *(unsigned short *)packet_ptr = packet_size;
  262. packet_ptr += packet_size;
  263. packet_size = 0;
  264. }
  265. };
  266. #endif