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

模拟服务器

开发平台:

C/C++

  1. #include "KRoleDBServer.h"
  2. #include "KRoleInfomation.h"
  3. #include "Windows.h"
  4. #include "KDBProcessThread.h"
  5. #include <crtdbg.h>
  6. #include "KException.h"
  7. #pragma warning(disable:4786)
  8. #include <objbase.h>
  9. #include <initguid.h>
  10. extern void * EnumSendMsg(unsigned long nId, size_t& nDataLen);
  11. //using namespace RoleDBServer
  12. RoleDBServer::KNetServer g_NetServer;
  13. size_t g_nMaxSendBuffer = 350;
  14. extern TRoleNetMsg  * pTestCmd;
  15. extern void SendToClient(unsigned long nId, TRoleNetMsg * pMsg, size_t nMsgLen);
  16. extern IServer * g_pNetServer;
  17. namespace RoleDBServer
  18. {
  19. KClientUser::KClientUser()
  20. {
  21. m_pCurrentRecvProcessData = NULL;
  22. m_pCurrentSendProcessData = NULL;
  23. m_nProcessLoadCount = m_nProcessWriteCount = 0;
  24. this->m_nCurSendLen = 0;
  25. this->m_nCurGetRecvLen = 0;
  26. this->m_szClientName[0] = 0;
  27. }
  28. int KNetServer::Init()
  29. {
  30. m_pNetServer = NULL;
  31. if (g_pNetServer)
  32. {
  33. g_pNetServer->QueryInterface( IID_IIOCPServer, reinterpret_cast< void ** >( &m_pNetServer ) );
  34. }
  35. if (!m_pNetServer)
  36. {
  37. throw KException("NetServer", "Cloning Net Server Error");
  38. }
  39. return 1;
  40. }
  41. void KNetServer::RegisterClient(unsigned long nId)
  42. {
  43. KClientUser * pNewUser = new KClientUser;
  44. pNewUser->m_ID = nId;
  45. m_ClientUserSet[nId] = pNewUser;
  46. }
  47. void KNetServer::DestoryClient(unsigned long nId)
  48. {
  49. KClientUser * pDelUse = m_ClientUserSet[nId];
  50. if (pDelUse)
  51. {
  52. m_ClientUserSet.erase(nId);
  53. delete pDelUse;
  54. }
  55. }
  56. //public
  57. int KNetServer::Receive()
  58. {
  59. KClientUserSet::iterator I;
  60. try{
  61. WaitForSingleObject(g_NetEventMutex, INFINITE);
  62. for ( I = m_ClientUserSet.begin(); I != m_ClientUserSet.end(); I ++ )
  63. {
  64. Receive(I->first);
  65. }
  66. ReleaseMutex(g_NetEventMutex);
  67. }
  68. catch(...)
  69. {
  70. }
  71. return 1;
  72. }
  73. int KNetServer::Send()
  74. {
  75. KClientUserSet::iterator I;
  76. m_pNetServer->PreparePackSink();
  77. for ( I = m_ClientUserSet.begin(); I != m_ClientUserSet.end(); I ++)
  78. {
  79. Send(I->first);
  80. }
  81. m_pNetServer->SendPackToClient(-1);
  82. return 1;
  83. }
  84. //private
  85. int KNetServer::Receive(unsigned long nId)
  86. {
  87. //获得数据
  88. size_t nDataLen = 0;
  89. TRoleNetMsg *pMsg;
  90. pMsg =(TRoleNetMsg*) m_pNetServer->GetPackFromClient(nId, nDataLen);
  91. if (nDataLen == 0 || pMsg == NULL) return 0;
  92. return AppendData(nId, pMsg, nDataLen);
  93. }
  94. int KNetServer::AppendData(unsigned long nId, TRoleNetMsg * pMsgBuffer, size_t nMsgLen)
  95. {
  96. switch(pMsgBuffer->bDataState)
  97. {
  98. case 1://游戏服务器向数据库服务器要求保存数据
  99. {
  100. KClientUser * pClientUser = m_ClientUserSet[nId];
  101. _ASSERT(!pClientUser->m_pCurrentRecvProcessData);
  102. if (!nMsgLen) return 0;
  103. pClientUser->m_pCurrentRecvProcessData =(TCmd*) new char[pMsgBuffer->nOffset + sizeof(TCmd) - 1];
  104. pClientUser->m_pCurrentRecvProcessData->nDataLen = pMsgBuffer->nOffset;
  105. pClientUser->m_pCurrentRecvProcessData->nProtoId = pMsgBuffer->nProtoId;
  106. pClientUser->m_pCurrentRecvProcessData->ulNetId = nId;
  107. memcpy(pClientUser->m_pCurrentRecvProcessData->pDataBuffer, &pMsgBuffer->pDataBuffer, pMsgBuffer->nDataLen);
  108. pClientUser->m_nCurGetRecvLen = pMsgBuffer->nDataLen;
  109. if (pClientUser->m_pCurrentRecvProcessData->nDataLen == pClientUser->m_nCurGetRecvLen)
  110. {
  111. InsertProcessData2Set(nId);
  112. ClearCurProcessData(nId);
  113. }
  114. }
  115. break;
  116. case 0:
  117. {
  118. KClientUser * pClientUser = m_ClientUserSet[nId];
  119. _ASSERT(pClientUser->m_pCurrentRecvProcessData->pDataBuffer);
  120. //_ASSERT(pClientUser->m_nCurGetRecvLen == pMsgBuffer->nOffset);
  121. _ASSERT(pClientUser->m_pCurrentRecvProcessData->nProtoId == pMsgBuffer->nProtoId);
  122. if (pClientUser->m_nCurGetRecvLen + pMsgBuffer->nDataLen > pClientUser->m_pCurrentRecvProcessData->nDataLen)
  123. _ASSERT(0);
  124. else
  125. {
  126. memcpy(pClientUser->m_pCurrentRecvProcessData->pDataBuffer + pClientUser->m_nCurGetRecvLen , &pMsgBuffer->pDataBuffer, pMsgBuffer->nDataLen);
  127. pClientUser->m_nCurGetRecvLen += pMsgBuffer->nDataLen;
  128. if (pClientUser->m_pCurrentRecvProcessData->nDataLen == pClientUser->m_nCurGetRecvLen)
  129. {
  130. InsertProcessData2Set(nId);
  131. ClearCurProcessData(nId);
  132. }
  133. }
  134. }break;
  135. default:
  136. {
  137. _ASSERT(0);
  138. }
  139. }
  140. return 1;
  141. }
  142. void KNetServer::InsertProcessData2Set(int nId)
  143. {
  144. KClientUser * pClientUser = m_ClientUserSet[nId];
  145. TCmd * pNewCmd = (TCmd *) (new char [sizeof(TCmd) + pClientUser->m_pCurrentRecvProcessData->nDataLen - 1]);
  146. pNewCmd->ulNetId = nId;
  147. pNewCmd->nDataLen = pClientUser->m_pCurrentRecvProcessData->nDataLen;
  148. pNewCmd->nProtoId  = pClientUser->m_pCurrentRecvProcessData->nProtoId;
  149. memcpy(&pNewCmd->pDataBuffer[0], pClientUser->m_pCurrentRecvProcessData->pDataBuffer, pClientUser->m_pCurrentRecvProcessData->nDataLen );
  150. EnterCriticalSection(&g_MainMsgListMutex);
  151. g_MainThreadCmdList.push_back(pNewCmd);
  152. pClientUser->m_nProcessLoadCount ++;
  153. LeaveCriticalSection(&g_MainMsgListMutex);
  154. }
  155. int KNetServer::Send(unsigned long nId)
  156. {
  157. KClientUser * pClient = m_ClientUserSet[nId];
  158. size_t ntmpSendLen = 0; //发送实际数据中的长度
  159. TRoleNetMsg * pMsg = NULL;
  160. bool bCompleteSend = false;
  161. char * pSendBuffer = NULL;
  162. if (pClient->m_pCurrentSendProcessData)
  163. {
  164. if (pClient->m_nCurSendLen == 0)
  165. {
  166. //如果一次性能够发完的
  167. if (pClient->m_pCurrentSendProcessData->nDataLen + sizeof(TRoleNetMsg) - 1 < g_nMaxSendBuffer)
  168. {
  169. pSendBuffer = new char [pClient->m_pCurrentSendProcessData->nDataLen + sizeof(TRoleNetMsg) - 1];
  170. ntmpSendLen = pClient->m_pCurrentSendProcessData->nDataLen ;
  171. bCompleteSend = true;
  172. }
  173. else
  174. {
  175. pSendBuffer = new char[g_nMaxSendBuffer];
  176. ntmpSendLen = g_nMaxSendBuffer - sizeof(TRoleNetMsg) + 1;
  177. bCompleteSend = false;
  178. pClient->m_nCurSendLen = ntmpSendLen;
  179. }
  180. pMsg = (TRoleNetMsg*)pSendBuffer;
  181. pMsg->nProtoId = pClient->m_pCurrentSendProcessData->nProtoId;
  182. pMsg->bDataState = 1;//first package send;
  183. pMsg->nOffset = pClient->m_pCurrentSendProcessData->nDataLen;
  184. pMsg->nDataLen = ntmpSendLen;
  185. memcpy(pMsg->pDataBuffer, pClient->m_pCurrentSendProcessData->pDataBuffer, ntmpSendLen);
  186. }
  187. else
  188. {
  189. if (pClient->m_pCurrentSendProcessData->nDataLen > pClient->m_nCurSendLen + g_nMaxSendBuffer - sizeof(TRoleNetMsg) + 1 )
  190. {
  191. ntmpSendLen = g_nMaxSendBuffer - sizeof(TRoleNetMsg) + 1;
  192. pSendBuffer = new char[g_nMaxSendBuffer] ;
  193. bCompleteSend = false;
  194. }
  195. else
  196. {
  197. ntmpSendLen = pClient->m_pCurrentSendProcessData->nDataLen - pClient->m_nCurSendLen ;
  198. pSendBuffer = new char[ntmpSendLen + sizeof(TRoleNetMsg) - 1];
  199. bCompleteSend = true;
  200. }
  201. pMsg = (TRoleNetMsg*)pSendBuffer;
  202. pMsg->nProtoId = pClient->m_pCurrentSendProcessData->nProtoId;
  203. pMsg->nOffset =  pClient->m_nCurSendLen;
  204. pMsg->nDataLen = ntmpSendLen;
  205. pMsg->bDataState = 0;
  206. memcpy(pMsg->pDataBuffer, pClient->m_pCurrentSendProcessData->pDataBuffer + pClient->m_nCurSendLen, ntmpSendLen);
  207. pClient->m_nCurSendLen += ntmpSendLen;
  208. }
  209.  m_pNetServer->PackDataToClient(nId, pMsg, ntmpSendLen + sizeof(TRoleNetMsg) - 1);
  210. }
  211. else
  212. {
  213. bCompleteSend = true;
  214. }
  215. if (bCompleteSend)
  216. {
  217. if (pClient->m_pCurrentSendProcessData)
  218. {
  219. delete pClient->m_pCurrentSendProcessData;
  220. pClient->m_pCurrentSendProcessData = NULL;
  221. }
  222. EnterCriticalSection(&g_NetMsgListMutex);
  223. list<TCmd *>::iterator I = g_NetServiceThreadCmdList.begin();
  224. if (I != g_NetServiceThreadCmdList.end())
  225. {
  226. TProcessData * pNewProcess = (TCmd *)new char[(*I)->nDataLen + sizeof(TProcessData) - 1];
  227. pNewProcess->nDataLen = (*I)->nDataLen;
  228. pNewProcess->nProtoId = (*I)->nProtoId;
  229. pNewProcess->ulNetId = (*I)->ulNetId;
  230. memcpy(&pNewProcess->pDataBuffer[0], (*I)->pDataBuffer, (*I)->nDataLen);
  231. pClient->m_pCurrentSendProcessData = pNewProcess;
  232. //how to delete 
  233. g_NetServiceThreadCmdList.pop_front();
  234. pClient->m_nCurSendLen = 0;
  235. pClient->m_nProcessWriteCount ++;
  236. }
  237. LeaveCriticalSection(&g_NetMsgListMutex);
  238. }
  239. return 1;
  240. }
  241. void KNetServer::ClearCurProcessData(unsigned long nId)
  242. {
  243. KClientUser * pClientUser = m_ClientUserSet[nId];
  244. delete pClientUser->m_pCurrentRecvProcessData;
  245. pClientUser->m_pCurrentRecvProcessData = NULL;
  246. }
  247. }