SockMsg_DBSrv.cpp
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:11k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. VOID WINAPI OnTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
  3. UINT WINAPI ProcessLogin(LPVOID lpParameter);
  4. UINT WINAPI ProcessUserHuman(LPVOID lpParameter);
  5. UINT WINAPI ProcessMonster(LPVOID lpParameter);
  6. UINT WINAPI ProcessNPC(LPVOID lpParameter);
  7. BOOL jRegGetKey(LPCTSTR pSubKeyName, LPCTSTR pValueName, LPBYTE pValue);
  8. char g_szRemainBuff[DATA_BUFSIZE];
  9. int g_nRemainBuffLen = 0;
  10. void ProcReceiveBuffer(char *pszPacket, int nRecv)
  11. {
  12. int nBuffLen = nRecv;
  13. char szBuff[DATA_BUFSIZE];
  14. char *pszFirst, *pszEnd = &szBuff[0], *pszDevide;
  15. _TDEFAULTMESSAGE DefMsg;
  16. _TDEFAULTMESSAGE SendDefMsg;
  17. int nCertification;
  18. WORD w1, w2;
  19. LONG lValid;
  20. int nPos;
  21. char szCC[32];
  22. char szEncodeMsg[256];
  23. CReadyUserInfo *pReadUserInfo;
  24. CUserInfo *pUserInfo;
  25. _TCLIENTITEMRCD tClientItemRcd;
  26. if (g_nRemainBuffLen)
  27. memmove(szBuff, g_szRemainBuff, g_nRemainBuffLen);
  28. memmove(&szBuff[g_nRemainBuffLen], pszPacket, nBuffLen + 1);
  29. nBuffLen += g_nRemainBuffLen;
  30. while (nBuffLen)
  31. {
  32. if ((pszFirst = (char *)memchr(pszEnd, '#', nBuffLen)) && (pszEnd = (char *)memchr(pszFirst, '!', nBuffLen)))
  33. {
  34. *pszEnd++ = '';
  35. if (pszDevide = (char *)memchr(pszFirst, '/', pszEnd - pszFirst))
  36. {
  37. *pszDevide++ = '';
  38. nCertification = AnsiStrToVal(pszFirst + 1);
  39. w1 = nCertification ^ 0xAA;
  40. w2 = memlen(pszDevide) - 1;
  41. lValid = MAKELONG(w1, w2);
  42. nPos = fnEncode6BitBufA((unsigned char *)&lValid, szCC, sizeof(LONG), sizeof(szCC));
  43. szCC[nPos] = '';
  44. if (memcmp((pszEnd - nPos - 1), szCC, nPos) == 0)
  45. {
  46. fnDecodeMessageA(&DefMsg, pszDevide);
  47. *(pszEnd - nPos - 1) = '';
  48. switch (DefMsg.wIdent)
  49. {
  50. case DBR_LOADHUMANRCD2:
  51. {
  52. CReadyUserInfo2* pReadyUserInfo2 = new CReadyUserInfo2;
  53. pReadyUserInfo2->m_dwReadyStartTime = GetTickCount();
  54. pReadyUserInfo2->m_nNumOfGenItem = HIBYTE(DefMsg.wParam);
  55. pReadyUserInfo2->m_nNumOfMagic = DefMsg.wSeries;
  56. pReadyUserInfo2->m_nNumOfItem = LOBYTE(DefMsg.wParam);
  57. fnDecode6BitBufA((pszDevide + DEFBLOCKSIZE), (char *)&pReadyUserInfo2->m_THumanRcd, sizeof(_THUMANRCD));
  58. memmove(pReadyUserInfo2->pszData, pszDevide + DEFBLOCKSIZE + HUMANRCDBLOCKSIZE, memlen(pszDevide + DEFBLOCKSIZE + HUMANRCDBLOCKSIZE));
  59. g_xReadyUserInfoList2.AddNewNode(pReadyUserInfo2);
  60. break;
  61. }
  62. case DBR_LOADHUMANRCD:
  63. {
  64. pReadUserInfo = (CReadyUserInfo *)DefMsg.nRecog;
  65. nPos = fnDecode6BitBufA((pszDevide + DEFBLOCKSIZE), (char *)&pReadUserInfo->m_pUserInfo->m_THumanRcd, sizeof(_THUMANRCD));
  66. char *pszData;
  67. pszData = (pszDevide + DEFBLOCKSIZE + HUMANRCDBLOCKSIZE);
  68. if (HIBYTE(DefMsg.wParam)) // Decode General Item
  69. {
  70. pReadUserInfo->m_pUserInfo->m_nNumOfGenItems = HIBYTE(DefMsg.wParam);
  71. _TGENITEMRCD GenItemRcd;
  72. char szVal[5];
  73. for (int i = 0; i < HIBYTE(DefMsg.wParam); i++)
  74. {
  75. _LPTGENERALITEMRCD lptGenItemRcd = new _TGENERALITEMRCD;
  76. if (lptGenItemRcd)
  77. {
  78. fnDecode6BitBufA(pszData, (char *)&GenItemRcd, sizeof(_TGENITEMRCD));
  79. memcpy(lptGenItemRcd->szMakeIndex, GenItemRcd.szItem, 12);
  80. ZeroMemory(szVal, sizeof(szVal));
  81. memcpy(szVal, &lptGenItemRcd->szMakeIndex[1], 3);
  82. lptGenItemRcd->nStdIndex = AnsiStrToVal(szVal);
  83. memcpy(szVal, &lptGenItemRcd->szMakeIndex[4], 4);
  84. lptGenItemRcd->nDura = AnsiStrToVal(szVal);
  85. memcpy(szVal, &lptGenItemRcd->szMakeIndex[8], 4);
  86. lptGenItemRcd->nDuraMax = AnsiStrToVal(szVal);
  87. pReadUserInfo->m_pUserInfo->m_lpTGenItemRcd.AddNewNode(lptGenItemRcd);
  88. pszData += GENITEMRCDBLOCKSIZE;
  89. }
  90. }
  91. }   
  92. if (DefMsg.wSeries) // Decode Magic
  93. {
  94. pReadUserInfo->m_pUserInfo->m_nNumOfMagics = DefMsg.wSeries;
  95. for (int i = 0; i < DefMsg.wSeries; i++)
  96. {
  97. _LPTHUMANMAGICRCD lpHumanMagicRcd = new _THUMANMAGICRCD;
  98. if (lpHumanMagicRcd)
  99. {
  100. fnDecode6BitBufA(pszData, (char *)lpHumanMagicRcd, sizeof(_THUMANMAGICRCD));
  101. pReadUserInfo->m_pUserInfo->m_lpTMagicRcd.AddNewNode(lpHumanMagicRcd);
  102. pszData += MAGICRCDBLOCKSIZE;
  103. //#ifdef _DEBUG
  104. // _RPT3(_CRT_WARN, "%d - %d - %dn", lpHumanMagicRcd->btLevel, lpHumanMagicRcd->btUseKey, lpHumanMagicRcd->nCurrTrain);
  105. //#endif
  106. }
  107. }
  108. }   
  109. if (LOBYTE(DefMsg.wParam)) // Decode Item
  110. {
  111. pReadUserInfo->m_pUserInfo->m_nNumOfItems = LOBYTE(DefMsg.wParam);
  112. // pReadUserInfo->m_pUserInfo->m_lpTItemRcd = (_LPTUSERITEMRCD)GlobalAlloc(GPTR, sizeof(_TUSERITEMRCD) * DefMsg.wParam);
  113. for (int i = 0; i < LOBYTE(DefMsg.wParam); i++)
  114. {
  115. _LPTUSERITEMRCD lpTItemRcd = new _TUSERITEMRCD;
  116. if (lpTItemRcd)
  117. {
  118. fnDecode6BitBufA(pszData, (char *)lpTItemRcd, sizeof(_TUSERITEMRCD));
  119. pReadUserInfo->m_pUserInfo->m_lpTItemRcd.AddNewNode(lpTItemRcd);
  120. pszData += ITEMRCDBLOCKSIZE;
  121. }
  122. }
  123. }
  124. if (DefMsg.wTag) // Decode Horse
  125. {
  126. if (!pReadUserInfo->m_pUserInfo->m_lpTHorseRcd)
  127. pReadUserInfo->m_pUserInfo->m_lpTHorseRcd = new _THORSERCD;
  128. fnDecode6BitBufA(pszData, (char *)pReadUserInfo->m_pUserInfo->m_lpTHorseRcd, sizeof(_THORSERCD));
  129. }
  130. if (pReadUserInfo->m_pUserInfo->m_pxPlayerObject)
  131. {
  132. pReadUserInfo->m_pUserInfo->m_pxPlayerObject->MakeFeature();
  133. pReadUserInfo->m_pUserInfo->m_pxPlayerObject->Initialize();
  134. pReadUserInfo->m_pUserInfo->m_pxPlayerObject->m_fIsAlive = TRUE;
  135. pReadUserInfo->m_pUserInfo->m_btCurrentMode = USERMODE_PLAYGAME;
  136. }
  137. break;
  138. }
  139. case DBR_MAKEITEMRCD:
  140. {
  141. pUserInfo = (CUserInfo *)DefMsg.nRecog;
  142. _LPTUSERITEMRCD lpTItemRcd = new _TUSERITEMRCD;
  143. if (lpTItemRcd)
  144. {
  145. nPos = fnDecode6BitBufA((pszDevide + DEFBLOCKSIZE), (char *)lpTItemRcd, sizeof(_TUSERITEMRCD));
  146. pUserInfo->m_lpTItemRcd.AddNewNode(lpTItemRcd);
  147. fnMakeDefMessage(&SendDefMsg, SM_ADDITEM, (int)pUserInfo->m_pxPlayerObject, 0, 0, 1);
  148. if (lpTItemRcd->szMakeIndex[0] != 'G')
  149. {
  150. g_pStdItemSpecial[lpTItemRcd->nStdIndex].GetStandardItem(&tClientItemRcd);
  151. g_pStdItemSpecial[lpTItemRcd->nStdIndex].GetUpgradeStdItem(&tClientItemRcd, lpTItemRcd);
  152. }
  153. memcpy(tClientItemRcd.szMakeIndex, lpTItemRcd->szMakeIndex, 12);
  154. tClientItemRcd.nDura = lpTItemRcd->nDura;
  155. tClientItemRcd.nDuraMax = lpTItemRcd->nDuraMax;
  156. nPos =  fnEncode6BitBufA((unsigned char *)&tClientItemRcd, szEncodeMsg, sizeof(_TCLIENTITEMRCD), sizeof(szEncodeMsg));
  157. szEncodeMsg[nPos] = '';
  158. pUserInfo->m_pxPlayerObject->SendSocket(&SendDefMsg, szEncodeMsg);
  159. }
  160. break;
  161. }
  162. case DBR_MAKEITEMRCD2:
  163. {
  164. CPlayerObject* pPlayerObject = (CPlayerObject *)DefMsg.nRecog;
  165. pUserInfo = pPlayerObject->m_pUserInfo;
  166. _LPTUSERITEMRCD lpTItemRcd = new _TUSERITEMRCD;
  167. if (lpTItemRcd)
  168. {
  169. nPos = fnDecode6BitBufA((pszDevide + DEFBLOCKSIZE), (char *)lpTItemRcd, sizeof(_TUSERITEMRCD));
  170. pUserInfo->m_lpTItemRcd.AddNewNode(lpTItemRcd);
  171. fnMakeDefMessage(&SendDefMsg, SM_ADDITEM, (int)pUserInfo->m_pxPlayerObject, 0, 0, 1);
  172. if (lpTItemRcd->szMakeIndex[0] != 'G')
  173. {
  174. g_pStdItemSpecial[lpTItemRcd->nStdIndex].GetStandardItem(&tClientItemRcd);
  175. g_pStdItemSpecial[lpTItemRcd->nStdIndex].GetUpgradeStdItem(&tClientItemRcd, lpTItemRcd);
  176. }
  177. memcpy(tClientItemRcd.szMakeIndex, lpTItemRcd->szMakeIndex, 12);
  178. tClientItemRcd.nDura = lpTItemRcd->nDura;
  179. tClientItemRcd.nDuraMax = lpTItemRcd->nDuraMax;
  180. nPos =  fnEncode6BitBufA((unsigned char *)&tClientItemRcd, szEncodeMsg, sizeof(_TCLIENTITEMRCD), sizeof(szEncodeMsg));
  181. szEncodeMsg[nPos] = '';
  182. pUserInfo->m_pxPlayerObject->SendSocket(&SendDefMsg, szEncodeMsg);
  183. }
  184. break;
  185. }
  186. }
  187. }
  188. }
  189. nBuffLen -= (pszEnd - pszFirst);
  190. }
  191. else
  192. break;
  193. } // while
  194. if (pszFirst && (nBuffLen > 0))
  195. {
  196. memmove(g_szRemainBuff, pszFirst, nBuffLen);
  197. g_nRemainBuffLen = nBuffLen;
  198. #ifdef _DEBUG
  199. _RPT2(_CRT_WARN, "ProcReceiveBuffer:%d, %sn", g_nRemainBuffLen, pszFirst);
  200. #endif
  201. }
  202. else
  203. g_nRemainBuffLen = 0;
  204. }
  205. VOID WINAPI OnProcessUserHuman(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
  206. LPARAM OnClientSockMsg(WPARAM wParam, LPARAM lParam)
  207. {
  208. switch (WSAGETSELECTEVENT(lParam))
  209. {
  210. case FD_CONNECT:
  211. {
  212. if (CheckSocketError(lParam))
  213. {
  214. InsertLogMsg(IDS_CONNECT_DBSERVER);
  215. KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);
  216. UINT dwThreadIDForMsg = 0;
  217. unsigned long hThreadForMsg = 0;
  218. // SetTimer(g_hMainWnd, _ID_TIMER_PROCESSUSERHUMAN, 1, (TIMERPROC)OnProcessUserHuman);
  219. if (hThreadForMsg = _beginthreadex(NULL, 0, ProcessLogin, NULL, 0, &dwThreadIDForMsg))
  220. {
  221. // SetThreadPriority((HANDLE)hThreadForMsg, THREAD_PRIORITY_HIGHEST);
  222. hThreadForMsg = _beginthreadex(NULL, 0, ProcessUserHuman, NULL, 0, &dwThreadIDForMsg);
  223. hThreadForMsg = _beginthreadex(NULL, 0, ProcessMonster, NULL, 0, &dwThreadIDForMsg);
  224. hThreadForMsg = _beginthreadex(NULL, 0, ProcessNPC, NULL, 0, &dwThreadIDForMsg);
  225. }
  226. int nPort;
  227. if (!jRegGetKey(_GAME_SERVER_REGISTRY, _TEXT("LocalPort"), (LPBYTE)&nPort))
  228. nPort = 5000;
  229. InitServerSocket(g_ssock, &g_saddr, _IDM_SERVERSOCK_MSG, nPort, 1);
  230. InsertLogMsg(IDS_STARTSERVICE);
  231. SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(0, 0), (LPARAM)_T("Ready"));
  232. }
  233. else
  234. {
  235. closesocket(g_csock);
  236. g_csock = INVALID_SOCKET;
  237. SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc);
  238. }
  239. break;
  240. }
  241. case FD_CLOSE:
  242. {
  243. closesocket(g_csock);
  244. g_csock = INVALID_SOCKET;
  245. InsertLogMsg(IDS_DISCONNECT_DBSERVER);
  246. break;
  247. }
  248. case FD_READ:
  249. {
  250. char szPacket[8096];
  251. int nRecv = recv((SOCKET)wParam, szPacket, sizeof(szPacket), 0);
  252. #ifdef _DEBUG
  253. _RPT1(_CRT_WARN, "ClientSockMsg[FD_READ]:%dn", nRecv);
  254. #endif
  255. szPacket[nRecv] = '';
  256. ProcReceiveBuffer(szPacket, nRecv);
  257. break;
  258. }
  259. }
  260. return 0L;
  261. }