Stream.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #include <iostream>
  2. #include <stdexcept>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <sys/socket.h>
  6. #include "common/stream/Stream.h"
  7. Stream::Stream(size_t minSize) : dataLength(getSize(minSize)),
  8. data(new unsigned char[dataLength]), writeIndex(0), readIndex(0)
  9. {
  10. }
  11. Stream::~Stream()
  12. {
  13. delete[] data;
  14. }
  15. size_t Stream::getSize(size_t minSize) const
  16. {
  17. size_t size = 1;
  18. while(size < minSize && size <= MAX_SIZE)
  19. {
  20. size <<= 1;
  21. }
  22. return size;
  23. }
  24. bool Stream::hasData() const
  25. {
  26. return readIndex < writeIndex;
  27. }
  28. bool Stream::resize(size_t minSize)
  29. {
  30. if(minSize > MAX_SIZE)
  31. {
  32. return true;
  33. }
  34. size_t newSize = getSize(minSize);
  35. //cout << "resize from " << dataLength << " to " << newSize << endl;
  36. unsigned char* newData = new unsigned char[newSize];
  37. memcpy(newData, data, writeIndex);
  38. delete[] data;
  39. data = newData;
  40. dataLength = newSize;
  41. return false;
  42. }
  43. void Stream::write(const void* writeData, size_t length)
  44. {
  45. if(writeIndex + length > dataLength && resize(writeIndex + length))
  46. {
  47. std::cout << "write over max stream size" << std::endl;
  48. return;
  49. }
  50. memcpy(data + writeIndex, writeData, length);
  51. writeIndex += length;
  52. }
  53. void Stream::write(const char* writeData)
  54. {
  55. write(writeData, strlen(writeData));
  56. }
  57. void Stream::writeChar(char c)
  58. {
  59. write(&c, sizeof(char));
  60. }
  61. void Stream::writeShort(int16_t s)
  62. {
  63. write(&s, sizeof(short));
  64. }
  65. void Stream::writeInt(int32_t i)
  66. {
  67. write(&i, sizeof(int));
  68. }
  69. void Stream::writeLong(int64_t l)
  70. {
  71. write(&l, sizeof(long));
  72. }
  73. void Stream::writeUnsignedChar(uint8_t uc)
  74. {
  75. write(&uc, sizeof(unsigned char));
  76. }
  77. void Stream::writeUnsignedShort(uint16_t us)
  78. {
  79. write(&us, sizeof(unsigned short));
  80. }
  81. void Stream::writeUnsignedInt(uint32_t ui)
  82. {
  83. write(&ui, sizeof(unsigned int));
  84. }
  85. void Stream::writeUnsignedLong(uint64_t ul)
  86. {
  87. write(&ul, sizeof(unsigned long));
  88. }
  89. bool Stream::read(void* buffer, size_t length)
  90. {
  91. if(readIndex + length > writeIndex)
  92. {
  93. std::cout << "read over stream data length" << std::endl;
  94. return true;
  95. }
  96. memcpy(buffer, data + readIndex, length);
  97. readIndex += length;
  98. return false;
  99. }
  100. char Stream::readChar(char error)
  101. {
  102. char c;
  103. if(read(&c, sizeof(char)))
  104. {
  105. return error;
  106. }
  107. return c;
  108. }
  109. int16_t Stream::readShort(int16_t error)
  110. {
  111. short s;
  112. if(read(&s, sizeof(short)))
  113. {
  114. return error;
  115. }
  116. return s;
  117. }
  118. int32_t Stream::readInt(int32_t error)
  119. {
  120. int i;
  121. if(read(&i, sizeof(int)))
  122. {
  123. return error;
  124. }
  125. return i;
  126. }
  127. int64_t Stream::readLong(int64_t error)
  128. {
  129. long l;
  130. if(read(&l, sizeof(long)))
  131. {
  132. return error;
  133. }
  134. return l;
  135. }
  136. unsigned char Stream::readUnsignedChar(unsigned char error)
  137. {
  138. unsigned char uc;
  139. if(read(&uc, sizeof(unsigned char)))
  140. {
  141. return error;
  142. }
  143. return uc;
  144. }
  145. uint16_t Stream::readUnsignedShort(uint16_t error)
  146. {
  147. unsigned short us;
  148. if(read(&us, sizeof(unsigned short)))
  149. {
  150. return error;
  151. }
  152. return us;
  153. }
  154. uint32_t Stream::readUnsignedInt(uint32_t error)
  155. {
  156. unsigned int ui;
  157. if(read(&ui, sizeof(unsigned int)))
  158. {
  159. return error;
  160. }
  161. return ui;
  162. }
  163. uint64_t Stream::readUnsignedLong(uint64_t error)
  164. {
  165. unsigned long ul;
  166. if(read(&ul, sizeof(unsigned long)))
  167. {
  168. return error;
  169. }
  170. return ul;
  171. }
  172. void Stream::readSocket(int socket)
  173. {
  174. writeIndex = 0;
  175. readIndex = 0;
  176. size_t bufferOffset = 0;
  177. ssize_t freeSpace = dataLength - writeIndex;
  178. while(true)
  179. {
  180. ssize_t readLength = recv(socket, data + bufferOffset, freeSpace, MSG_DONTWAIT);
  181. if(readLength <= 0)
  182. {
  183. break;
  184. }
  185. writeIndex += readLength;
  186. if(readLength < freeSpace)
  187. {
  188. break;
  189. }
  190. else
  191. {
  192. resize(dataLength + 1);
  193. freeSpace = dataLength - writeIndex;
  194. bufferOffset += readLength;
  195. }
  196. }
  197. }
  198. void Stream::sendToSocket(int socket)
  199. {
  200. size_t bufferOffset = 0;
  201. size_t sendLength = writeIndex;
  202. while(sendLength > 0)
  203. {
  204. ssize_t writtenLength = send(socket, data + bufferOffset, sendLength, MSG_NOSIGNAL);
  205. if(writtenLength == -1)
  206. {
  207. perror("Cannot send data");
  208. return;
  209. }
  210. sendLength -= writtenLength;
  211. bufferOffset += writtenLength;
  212. }
  213. }