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

模拟服务器

开发平台:

C/C++

  1. #ifndef XBUFFER_H
  2. #define XBUFFER_H
  3. #define MINIMIZE_BLOCK 32 //最小块大小为32字节
  4. class ZBuffer {
  5. char *send_buffer; //实际使用的发送缓冲区
  6. char *receive_buffer; //实际使用的接收缓冲区
  7. long max_send; //发送缓冲区的大小
  8. long max_receive; //接收缓冲区的大小
  9. //下面是一些统计数据
  10. bool bPerf;
  11. // ZPerf send_perf; //发送性能统计
  12. // ZPerf receive_perf; //接收性能统计
  13. char *receive_ptr; //当前接收数据的指针
  14. long receive_size; //接收数据的大小
  15. char *send_ptr; //当前发送数据的指针
  16. long send_size; //发送数据的大小
  17. char *packet_ptr; //当前数据包的开始指针
  18. long packet_size; //当前数据包的大小
  19. public:
  20. ZBuffer(long the_max_send, long the_max_receive) {
  21. send_buffer = new char[the_max_send];
  22. if(send_buffer) max_send = the_max_send;
  23. else max_send = 0;
  24. receive_buffer = new char[the_max_receive];
  25. if(receive_buffer) max_receive = the_max_receive;
  26. else max_receive = 0;
  27. }
  28. virtual ~ZBuffer() {
  29. if(send_buffer) delete[] send_buffer;
  30. if(receive_buffer) delete[] receive_buffer;
  31. }
  32. //下面是对外提供的接口
  33. void stopPerf() {
  34. bPerf = false;
  35. send_perf.stop();
  36. receive_perf.stop();
  37. }
  38. void startPerf() {
  39. bPerf = true;
  40. send_perf.start();
  41. receive_perf.start();
  42. }
  43. //获取可用的接收数据的缓冲区
  44. char *getReceiveBuffer(int &size) {
  45. if(receive_size + MINIMIZE_BLOCK > max_receive) {
  46. //超出最大缓冲区,关闭连接
  47. return NULL;
  48. }
  49. if(receive_ptr + receive_size + MINIMIZE_BLOCK > receive_buffer + max_receive) { //尾部数据不够了
  50. memmove(receive_buffer, receive_ptr, receive_size);
  51. receive_ptr = receive_buffer;
  52. }
  53. size = max_receive - (receive_ptr - receive_buffer) - receive_size;
  54. return receive_ptr + receive_size;
  55. }
  56. void receiveData(int size) {
  57. receive_ptr += size;
  58. }
  59. const char *getPacket(int &size) {
  60. if(receive_size < sizeof(unsigned short)) return NULL;
  61. size = *(unsigned short *)receive_ptr;
  62. if(receive_size >= size + sizeof(unsigned short)) {
  63. receive_ptr += sizeof(unsigned short);
  64. const char *result = (const char *)receive_ptr;
  65. receive_ptr += size;
  66. return result;
  67. }
  68. return NULL;
  69. }
  70. void clear() {
  71. send_ptr = send_buffer;
  72. *(unsigned short *)send_ptr = 0;
  73. send_size = 0;
  74. packet_size = 0;
  75. }
  76. //发送数据的接口分成两个函数,一个是获取当前发送的缓冲区和长度,另外一个是从缓冲区清除指定大小的数据
  77. char *getSendData(int &size) {
  78. size = (int)*(unsigned short *)send_ptr;
  79. if(size) return send_ptr;
  80. else return NULL;
  81. }
  82. void sendData(int size) {
  83. send_ptr += size;
  84. send_size -= size;
  85. if(!send_size) {
  86. send_ptr = packet_ptr = send_buffer;
  87. }
  88. }
  89. bool packData(const char *data, int size) {
  90. if(send_size + size + MINIMIZE_BLOCK >= max_send) {
  91. //缓冲区满,关闭连接
  92. }
  93. if(!packet_size) {
  94. packet_ptr += sizeof(unsigned short); //头上两个字节表示大小
  95. *(unsigned short *)packet_ptr = 0;
  96. }
  97. if(packet_ptr + packet_size + size + MINIMIZE_BLOCK >= send_buffer + max_send) { //尾部的空间不够了
  98. memmove(send_buffer, send_ptr, send_size);
  99. send_ptr = send_buffer;
  100. packet_ptr -= (send_ptr - send_buffer);
  101. }
  102. memcpy(packet_ptr + packet_size, data, size);
  103. packet_size += size;
  104. send_size += size;
  105. }
  106. char *sendPacket(int index, int &datalength) { //完成一个数据包
  107. *(unsigned short *)packet_ptr = packet_size;
  108. packet_ptr += packet_size;
  109. packet_size = 0;
  110. }
  111. };
  112. #endif