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

模拟服务器

开发平台:

C/C++

  1. #include "KTransferUnit.h"
  2. #include "package.h"
  3. #include "KWin32.h"
  4. #ifndef min
  5. #define min(a,b)            (((a) < (b)) ? (a) : (b))
  6. #endif
  7. KTransferUnit::KTransferUnit(DWORD dwIp, DWORD dwRelayID)
  8. {
  9. m_dwIp = dwIp;
  10. m_dwRelayID = dwRelayID;
  11. }
  12. KTransferUnit::~KTransferUnit()
  13. {
  14. }
  15. //如果组装成为一个完整的包则返回数据指针否则返回空
  16. char *CPackager::PackUp(const void *data, int size) {
  17. int cID = (int)*(unsigned char *)data;
  18. unsigned char cFlag = *((unsigned char *)data + 1);
  19. if (!data_ptr[cID])
  20. data_ptr[cID] = new char[MAX_PACKAGE];
  21. if (!data_ptr[cID])
  22. return NULL;
  23. size -= 2 + sizeof(unsigned long);
  24. if(cFlag & 0xc0) { //head
  25. data_size[cID] = size;
  26. memcpy(data_ptr[cID], (char *)data + 2 + sizeof(unsigned long), size);
  27. size = 0;
  28. }
  29. if(cFlag & 0x30) { //middle
  30. if(size) {
  31. memcpy(data_ptr[cID] + data_size[cID], (char *)data + 2 + sizeof(unsigned long), size);
  32. data_size[cID] += size;
  33. }
  34. size = 0;
  35. }
  36. if(cFlag & 0xc) { //tail
  37. if(size) {
  38. memcpy(data_ptr[cID] + data_size[cID], (char *)data + 2 + sizeof(unsigned long), size);
  39. }
  40. data_size[cID] = 0;
  41. return data_ptr[cID];
  42. }
  43. else return NULL;
  44. }
  45. void CPackager::AddData( BYTE cID, const char * const pData, size_t dataLength, unsigned long lnUserData /* = 0 */ )
  46. {
  47. //printf("add data...%d, %dn", cID, dataLength);
  48. char *pBuffer = NULL;
  49. int& nSize = send_data_size[cID];
  50. if (!send_data_ptr[cID])
  51. {
  52. send_data_ptr[cID] = new char[MAX_PACKAGE];
  53. send_data_size[cID] = 0;
  54. }
  55. pBuffer = send_data_ptr[cID];
  56. user_data[cID] = lnUserData;
  57. //ASSERT( pBuffer && dataLength + nSize < MAX_PACKAGE);
  58. memcpy(pBuffer + nSize, pData, dataLength);
  59. nSize += dataLength;
  60. }
  61. void CPackager::DelData( BYTE cID )
  62. {
  63. //printf("del data...%d, %dn", cID, send_data_size[cID]);
  64. send_data_size[cID] = 0;
  65. user_data[cID] = 0;
  66. split_pos[cID] = 0;
  67. pack_len[cID] = 0;
  68. }
  69. char *CPackager::GetHeadPack( BYTE cID, size_t& actualLength, size_t packLength /* = 512 */)
  70. {
  71. if (send_data_size[cID] > 0)
  72. {
  73. char *pBuffer = send_data_ptr[cID];
  74. int nSize = send_data_size[cID];
  75. split_pos[cID] = 0;
  76. pack_len[cID] = packLength - 2;
  77. actualLength = nSize - split_pos[cID];
  78. actualLength = min(pack_len[cID], actualLength);
  79. split_pos[cID] += actualLength;
  80. if ( 0 == actualLength )
  81. return NULL;
  82. char* pPack = getpackdata(cID);
  83. if ( NULL == pPack )
  84. {
  85. return NULL;
  86. }
  87. /*
  88.  * Add a prototype
  89.  */
  90. pPack[0] = cID;
  91. /*
  92.  * Add a flag
  93.  */
  94. BYTE cFlag = 0xc0;
  95. if ( nSize <= split_pos[cID])//!pBuffer->HaveNextPack() )
  96. {
  97. cFlag |= 0xc;
  98. }
  99. pPack[1] = cFlag;
  100. /*
  101.  * Add a user data into this buffer
  102.  */
  103. *((unsigned long*)(pPack + 2)) = user_data[cID];
  104. /*
  105.  * Add some data into this buffer
  106.  */
  107. memcpy(pPack + 2 + sizeof(unsigned long), pBuffer, actualLength);
  108. //printf("head pack data...%d, %d/%dn", cID, actualLength, send_data_size[cID]);
  109. actualLength += 2 + sizeof(unsigned long);
  110. return pPack;
  111. }
  112. return NULL;
  113. }
  114. char *CPackager::GetNextPack( BYTE cID, size_t& actualLength )
  115. {
  116. if (send_data_size[cID] > split_pos[cID])
  117. {
  118. char *pBuffer = send_data_ptr[cID];
  119. pBuffer += split_pos[cID];
  120. char *pPack = getpackdata(cID);
  121. if ( NULL == pPack )
  122. {
  123. return NULL;
  124. }
  125. actualLength = send_data_size[cID] - split_pos[cID];
  126. actualLength = min(pack_len[cID], actualLength);
  127. split_pos[cID] += actualLength;
  128. /*
  129.  * Add a prototype
  130.  */
  131. pPack[0] = cID;
  132. /*
  133.  * Add a flag
  134.  */
  135. BYTE cFlag = 0x30;
  136. if ( send_data_size[cID] <= split_pos[cID])//!pBuffer->HaveNextPack() )
  137. {
  138. cFlag |= 0xc;
  139. }
  140. pPack[1] = cFlag;
  141. /*
  142.  * Add a user data into this buffer
  143.  */
  144. *((unsigned long*)(pPack + 2)) = user_data[cID];
  145. /*
  146.  * Add some data into this buffer
  147.  */
  148. memcpy(pPack + 2 + sizeof(unsigned long), pBuffer, actualLength);
  149. //printf("next pack data...%d, %d/%dn", cID, actualLength, send_data_size[cID]);
  150. actualLength += 2 + sizeof(unsigned long);
  151. return pPack;
  152. }
  153. return NULL;
  154. }