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

模拟服务器

开发平台:

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. using OnlineGameLib::Win32::CPackager;
  18. using OnlineGameLib::Win32::CBuffer;
  19. namespace RoleDBServer
  20. {
  21. KClientUser::KClientUser()
  22. {
  23. m_nProcessLoadCount = m_nProcessWriteCount = 0;
  24. this->m_szClientName[0] = 0;
  25. this->m_nCurSendNo = 0;
  26. m_ulSendBufferCount = 0;
  27. m_ulRecvBufferCount = 0;
  28. m_CurrentProtocol = 0;
  29. }
  30. KClientUser::~KClientUser()
  31. {
  32. }
  33. int KNetServer::Init()
  34. {
  35. m_pNetServer = NULL;
  36. if (g_pNetServer)
  37. {
  38. g_pNetServer->QueryInterface( IID_IIOCPServer, reinterpret_cast< void ** >( &m_pNetServer ) );
  39. }
  40. if (!m_pNetServer)
  41. {
  42. throw KException("NetServer", "Cloning Net Server Error");
  43. }
  44. return 1;
  45. }
  46. void KNetServer::RegisterClient(unsigned long nId)
  47. {
  48. int t = ClearClientSend(nId);
  49. CCriticalSection::Owner locker(g_NetMsgListMutex);
  50. if (!m_ClientUserSet[nId])
  51. {
  52. KClientUser * pNewUser = new KClientUser;
  53. pNewUser->m_ID = nId;
  54. m_ClientUserSet[nId] = pNewUser;
  55. }
  56. }
  57. int KNetServer::ClearClientSend(unsigned long nId)
  58. {
  59. int i = 0;
  60. {
  61. CCriticalSection::Owner locker(g_NetMsgListMutex);
  62. list<TCmd *>::iterator I = g_NetServiceThreadCmdList.begin();
  63. while (I != g_NetServiceThreadCmdList.end())
  64. {
  65. if ((*I)->ulNetId == nId)
  66. {
  67. i++;
  68. list<TCmd *>::iterator II = I;
  69. I ++;
  70. delete []*II;
  71. g_NetServiceThreadCmdList.erase(II);
  72. }
  73. else
  74. I ++;
  75. }
  76. }
  77. {
  78. CCriticalSection::Owner locker(g_MainMsgListMutex);
  79. list<TCmd*>::iterator MainMsgI = g_MainThreadCmdList.begin();
  80. while(MainMsgI != g_MainThreadCmdList.end())
  81. {
  82. if ((*MainMsgI)->ulNetId == nId)
  83. {
  84. list<TCmd*>::iterator II1 = MainMsgI;
  85. MainMsgI ++;
  86. delete [](*II1);
  87. g_MainThreadCmdList.erase(II1);
  88. }
  89. else 
  90. MainMsgI ++;
  91. }
  92. }
  93. {
  94. CCriticalSection::Owner locker(g_GetRoleInfoMutex);
  95. list<TGetRoleInfoFromDB*>::iterator DBLoadI = g_DBLoadThreadCmdList.begin();
  96. while(DBLoadI != g_DBLoadThreadCmdList.end())
  97. {
  98. if ((*DBLoadI)->nNetId == nId)
  99. {
  100. list<TGetRoleInfoFromDB*>::iterator II2 = DBLoadI;
  101. DBLoadI ++;
  102. delete (*II2);
  103. g_DBLoadThreadCmdList.erase(II2);
  104. }
  105. else 
  106. DBLoadI ++;
  107. }
  108. }
  109. return i;
  110. }
  111. void KNetServer::DestoryClient(unsigned long nId)
  112. {
  113. CCriticalSection::Owner locker(g_NetMsgListMutex);
  114. int t = ClearClientSend(nId);
  115. KClientUser * pDelUse = m_ClientUserSet[nId];
  116. if (pDelUse)
  117. {
  118. delete pDelUse;
  119. m_ClientUserSet.erase(nId);
  120. }
  121. }
  122. //public
  123. int KNetServer::Receive()
  124. {
  125. KClientUserSet::iterator I;
  126. try{
  127. CCriticalSection::Owner locker(g_NetMsgListMutex);
  128. for ( I = m_ClientUserSet.begin(); I != m_ClientUserSet.end(); I ++ )
  129. {
  130. Receive(I->first);
  131. }
  132. }
  133. catch(...)
  134. {
  135. g_nMistakeCount ++;
  136. }
  137. return 1;
  138. }
  139. int KNetServer::Send()
  140. {
  141. KClientUserSet::iterator I;
  142. for ( I = m_ClientUserSet.begin(); I != m_ClientUserSet.end(); I ++)
  143. {
  144. Send(I->first);
  145. }
  146. return 1;
  147. }
  148. //private
  149. int KNetServer::Receive(unsigned long nId)
  150. {
  151. //获得数据
  152. size_t nDataLen = 0;
  153. const void * pMsg = NULL;
  154. pMsg = m_pNetServer->GetPackFromClient(nId, nDataLen);
  155. if (nDataLen == 0 || pMsg == NULL) return 0;
  156. TProcessData* pData = (TProcessData*)pMsg;
  157. return AppendData(nId, pMsg, nDataLen);
  158. }
  159. int KNetServer::AppendData(unsigned long nId, const void * pMsgBuffer, size_t nMsgLen)
  160. {
  161. KClientUser * pClientUser = m_ClientUserSet[nId];
  162. _ASSERT(pClientUser);
  163. pClientUser->m_ulRecvBufferCount += nMsgLen;
  164. g_dwRecvLen = pClientUser->m_ulRecvBufferCount;
  165. if (pClientUser->m_ulRecvBufferCount >= 0xFFFF1FFF)
  166. pClientUser->m_ulRecvBufferCount = 0;
  167. BYTE btProtoId = CPackager::Peek(pMsgBuffer);
  168. if (btProtoId > c2s_micropackbegin)
  169. {
  170. TProcessData * pProcessData = (TProcessData*)pMsgBuffer;
  171. if (pProcessData->nDataLen + sizeof(TProcessData) - 1 != nMsgLen)
  172. {
  173. _ASSERT(0);
  174. return 1;
  175. }
  176. return Service(pClientUser , (TProcessData *)pMsgBuffer, nId);
  177. }
  178. else
  179. {
  180. CBuffer* pData = pClientUser->m_RecvPackager.PackUp( pMsgBuffer, nMsgLen );
  181. if (pData)
  182. {
  183. TProcessData * pProcessData = (TProcessData*)pData->GetBuffer();
  184. if (pProcessData->nDataLen + sizeof(TProcessData) - 1 != pData->GetUsed())
  185. {
  186. _ASSERT(0);
  187. SAFE_RELEASE(pData);
  188. return 1;
  189. }
  190. Service(pClientUser , (TProcessData*)pData->GetBuffer(), nId);
  191. SAFE_RELEASE(pData);
  192. }
  193. }
  194. return 1;
  195. }
  196. int KNetServer::Service(KClientUser *pClientUser, TProcessData * pProcess, int nId)
  197. {
  198. if (!pProcess) return 0;
  199. TCmd * pNewCmd = (TCmd *) (new char [sizeof(TCmd) + pProcess->nDataLen - 1]);
  200. pNewCmd->ProcessData.nDataLen = pProcess->nDataLen;
  201. pNewCmd->ProcessData.nProtoId  = pProcess->nProtoId;
  202. pNewCmd->ProcessData.ulIdentity = pProcess->ulIdentity;
  203. pNewCmd->ulNetId = nId;
  204. memcpy(&pNewCmd->ProcessData.pDataBuffer[0], &pProcess->pDataBuffer[0], pProcess->nDataLen);
  205. CCriticalSection::Owner locker(g_MainMsgListMutex);
  206. g_MainThreadCmdList.push_back(pNewCmd);
  207. pClientUser->m_nProcessLoadCount ++;
  208. return 1;
  209. }
  210. int KNetServer::Send(unsigned long nId)
  211. {
  212. KClientUser * pClient = m_ClientUserSet[nId];
  213. CBuffer  * pSendBuffer = NULL;
  214. if (pClient)
  215. {
  216. if (pClient->m_CurrentProtocol)
  217. {
  218. pSendBuffer = pClient->m_SendPackager.GetNextPack( pClient->m_CurrentProtocol);
  219. if (pSendBuffer)
  220. {
  221. int nLen = pSendBuffer->GetUsed();
  222. }
  223. }
  224. if ((!pSendBuffer) || !pClient->m_CurrentProtocol) 
  225. {
  226. if (pClient->m_CurrentProtocol && pClient->m_CurrentProtocol < 32)
  227. pClient->m_SendPackager.DelData(pClient->m_CurrentProtocol);
  228. pClient->m_CurrentProtocol = 0;
  229. CCriticalSection::Owner locker(g_NetMsgListMutex);
  230. list<TCmd *>::iterator I = g_NetServiceThreadCmdList.begin();
  231. while (I != g_NetServiceThreadCmdList.end())
  232. {
  233. int nIdd = (*I)->ulNetId;
  234. if ((*I)->ulNetId == nId)
  235. {
  236. if ((*I)->ProcessData.nProtoId >= 32)
  237. {
  238. TProcessData * pProc = (TProcessData *)&(*I)->ProcessData;
  239. m_pNetServer->SendData(nId, &(*I)->ProcessData, (*I)->ProcessData.nDataLen + sizeof(TProcessData) - 1);
  240. pClient->m_ulSendBufferCount +=  (*I)->ProcessData.nDataLen + sizeof(TProcessData) - 1;
  241. g_dwSendLen = pClient->m_ulSendBufferCount;
  242. pClient->m_CurrentProtocol = 0;
  243. pSendBuffer = NULL;
  244. }
  245. else
  246. {
  247. pClient->m_CurrentProtocol = (*I)->ProcessData.nProtoId;
  248. TCmd * pCmd = *I;
  249. TProcessData * pTestData = (TProcessData *)&(*I)->ProcessData;
  250. pClient->m_SendPackager.AddData((*I)->ProcessData.nProtoId, (const char *)&(*I)->ProcessData, (*I)->ProcessData.nDataLen + sizeof(TProcessData) - 1, (*I)->ProcessData.ulIdentity );
  251. pSendBuffer = pClient->m_SendPackager.GetHeadPack(pClient->m_CurrentProtocol);
  252. }
  253. delete [](*I);
  254. g_NetServiceThreadCmdList.erase(I);
  255. pClient->m_nProcessWriteCount ++;
  256. break;
  257. }
  258. I ++;
  259. }
  260. }
  261. /* TRoleData * pRoleData = pBuffer;
  262. OnlineGameLib::Win32::CPackager m_Packager;
  263. TProcessData * pData = (TProcessData *)new char[pRoleData->dwDataLen + sizeof(TProcessData) -1 + 1];
  264. pData->nProtoId = c2s_roleserver_saveroleinfo;
  265. pData->pDataBuffer[0] = create_role;//or pData[0] = save_role    
  266. pData->nDataLen = pRoleData->dwDataLen + 1 ;
  267. pData->ulIdentity = id;
  268. memcpy(&pData->pDataBuffer[1], pRoleData, pRoleData->dwDataLen);
  269. m_Packager.AddData(pData->nProtoId, pData, pData->nDataLen + sizeof(TProcessData) -1, id);
  270. CBuffer * pBuffer = m_Packager.GetHeadPack(pData->nProtoId);
  271. while(pBuffer)
  272. {
  273. Send(pBuffer->GetBuffer());
  274. SAFE_RELEASE(pBuffer);
  275. pBuffer = m_Packager.GetNextPack(pData->nProtoId);
  276. }
  277. m_Packager.DelData(pData->nProtoId);
  278. */
  279. if (pSendBuffer)
  280. {
  281. m_pNetServer->SendData(nId, pSendBuffer->GetBuffer(), pSendBuffer->GetUsed());
  282. pClient->m_ulSendBufferCount += pSendBuffer->GetUsed();
  283. g_dwSendLen = pClient->m_ulSendBufferCount;
  284. if (pClient->m_ulSendBufferCount >= 0xFFFF1FFF)
  285. pClient->m_ulSendBufferCount = 0;
  286. SAFE_RELEASE(pSendBuffer);
  287. g_dwSendLen = pClient->m_ulSendBufferCount;
  288. }
  289. }
  290. return 1;
  291. }
  292. }