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

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "../def/dbmgr.h"
  3. #include <stdio.h>
  4. extern CWHList< GAMESERVERINFO* > g_xGameServerList;
  5. extern char g_szServerList[1024];
  6. int CompareDBString( char *str1, char *str2 )
  7. {
  8. ChangeSpaceToNull( str1 );
  9. ChangeSpaceToNull( str2 );
  10. return strcmp( str1, str2 );
  11. }
  12. int GetCertification() 
  13. static long g_nCertification = 30;
  14. InterlockedIncrement(&g_nCertification);
  15. if (g_nCertification >= 0x7FFFFFFF) 
  16. g_nCertification = 30; 
  17. return g_nCertification; 
  18. }
  19. /* **************************************************************************************
  20. Close
  21. PURPOSE : Send packet to login gate server.
  22. NOTE
  23. 1. Packet construction : Packet % + client socket handle + / # + packet + ! + $
  24.    ************************************************************************************** */
  25. void CGateInfo::Close()
  26. {
  27. PLISTNODE pListNode;
  28. CUserInfo* pUserInfo;
  29. if (xUserInfoList.GetCount())
  30. {
  31. pListNode = xUserInfoList.GetHead();
  32. while (pListNode)
  33. {
  34. pUserInfo = xUserInfoList.GetData(pListNode);
  35. if (pUserInfo)
  36. {
  37. delete pUserInfo;
  38. pUserInfo = NULL;
  39. pListNode = xUserInfoList.RemoveNode(pListNode);
  40. continue;
  41. }
  42. pListNode = xUserInfoList.GetNext(pListNode);
  43. }
  44. }
  45. closesocket(sock);
  46. sock = INVALID_SOCKET;
  47. }
  48. /* **************************************************************************************
  49. SendToGate 
  50. PURPOSE : Send packet to login gate server.
  51. NOTE
  52. 1. Packet construction : Packet % + client socket handle + / # + packet + ! + $
  53.    ************************************************************************************** */
  54. void CGateInfo::SendToGate(SOCKET cSock, char *pszPacket)
  55. {
  56. char szData[256];
  57. WSABUF buf;
  58. DWORD dwSendBytes;
  59. // wsprintf(szData, _TEXT("%%%d/#%s!$"), (int)cSock, pszPacket);
  60. int nLen = memlen(pszPacket) - 1;
  61. szData[0] = '%';
  62. char *pszNext = ValToAnsiStr((int)cSock, &szData[1]);
  63. *pszNext++ = '/';
  64. *pszNext++ = '#';
  65. memmove(pszNext, pszPacket, nLen);
  66. pszNext += nLen;
  67. *pszNext++ = '!';
  68. *pszNext++ = '$';
  69. *pszNext++ = '';
  70. buf.len = pszNext - szData;
  71. buf.buf = szData;
  72. WSASend(sock, &buf, 1, &dwSendBytes, 0, NULL, NULL);
  73. }
  74. /* **************************************************************************************
  75. MakeNewUser
  76. PURPOSE : 
  77. NOTE
  78.    ************************************************************************************** */
  79. void CGateInfo::MakeNewUser(char *pszPacket)
  80. {
  81. char szDecodeMsg[256];
  82. char szEncodeMsg[32];
  83. char *pszID, *pszName, *pszPassword;
  84. _TDEFAULTMESSAGE DefMsg;
  85. fnDecodeMessageA(&DefMsg, pszPacket);
  86. if (DefMsg.wIdent == CM_ADDNEWUSER)
  87. {
  88. int nPos = fnDecode6BitBufA((pszPacket + DEFBLOCKSIZE), szDecodeMsg, sizeof(szDecodeMsg));
  89. szDecodeMsg[nPos] = '';
  90. pszID = &szDecodeMsg[0];
  91. pszName = (char *)memchr(szDecodeMsg, '/', memlen(szDecodeMsg) - 1);
  92. *pszName = '';
  93. pszName++;
  94. pszPassword = (char *)memchr(pszName, '/', memlen(pszName) - 1);
  95. *pszPassword = '';
  96. pszPassword++;
  97. if ((memlen(pszID) - 1) || (memlen(pszName) - 1) || (memlen(pszPassword) - 1))
  98. {
  99. char szQuery[1024];
  100. sprintf( szQuery, 
  101. "INSERT TBL_ACCOUNT( FLD_LOGINID, FLD_PASSWORD, FLD_USERNAME, FLD_CERTIFICATION ) "
  102. "VALUES( '%s', '%s', '%s', 0 )",
  103. pszID, pszPassword, pszName );
  104. CRecordset *pRec = GetDBManager()->CreateRecordset();
  105. if ( pRec->Execute( szQuery ) && pRec->GetRowCount() )
  106. fnMakeDefMessageA( &DefMsg, SM_NEWID_SUCCESS, 0, 0, 0, 0 );
  107. else
  108. fnMakeDefMessageA( &DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0 );
  109. GetDBManager()->DestroyRecordset( pRec );
  110. // -----------------------------------------------------------------------------------
  111. }
  112. else
  113. fnMakeDefMessageA(&DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0);
  114. fnEncodeMessageA(&DefMsg, szEncodeMsg, sizeof(szEncodeMsg));
  115. szDecodeMsg[0] = '#';
  116. memmove(&szDecodeMsg[1], szEncodeMsg, DEFBLOCKSIZE);
  117. szDecodeMsg[DEFBLOCKSIZE + 1] = '!';
  118. szDecodeMsg[DEFBLOCKSIZE + 2] = '';
  119. send(sock, szDecodeMsg, DEFBLOCKSIZE + 2, 0); 
  120. }
  121. }
  122. /* **************************************************************************************
  123. ReceiveServerMsg
  124. PURPOSE : 
  125. NOTE
  126.    ************************************************************************************** */
  127. void CGateInfo::ReceiveServerMsg(char *pszPacket)
  128. {
  129. char *pszPos;
  130. int nCertification;
  131. int nLen = memlen(pszPacket);
  132. if (pszPos = (char *)memchr(pszPacket, '/', nLen))
  133. {
  134. *pszPos++ = '';
  135. nCertification = AnsiStrToVal(pszPos);
  136. char szQuery[256];
  137. sprintf( szQuery, 
  138. "UPDATE TBL_ACCOUNT SET FLD_CERTIFICATION=%d WHERE FLD_LOGINID='%s'", 
  139. nCertification, pszPacket );
  140. CRecordset *pRec = GetDBManager()->CreateRecordset();
  141. pRec->Execute( szQuery );
  142. GetDBManager()->DestroyRecordset( pRec );
  143. }
  144. }
  145. void CGateInfo::ReceiveOpenUser(char *pszPacket)
  146. {
  147. char *pszPos;
  148. int nSocket;
  149. int nLen = memlen(pszPacket);
  150. if (pszPos = (char *)memchr(pszPacket, '/', nLen))
  151. {
  152. nSocket = AnsiStrToVal(pszPacket);
  153. pszPos++;
  154. CUserInfo* pUserInfo = new CUserInfo;
  155. if (pUserInfo)
  156. {
  157. MultiByteToWideChar(CP_ACP, 0, pszPacket, -1, pUserInfo->szSockHandle, sizeof(pUserInfo->szSockHandle)/sizeof(TCHAR));
  158. MultiByteToWideChar(CP_ACP, 0, pszPos, -1, pUserInfo->szAddress, sizeof(pUserInfo->szAddress)/sizeof(TCHAR));
  159. pUserInfo->sock = nSocket;
  160. pUserInfo->nCertification = 0;
  161. pUserInfo->nClientVersion = 0;
  162. pUserInfo->fSelServerOk = FALSE;
  163. ZeroMemory(pUserInfo->szUserID, sizeof(pUserInfo->szUserID));
  164. xUserInfoList.AddNewNode(pUserInfo);
  165. InsertLogMsgParam(IDS_OPEN_USER, pUserInfo->szAddress);
  166. }
  167. }
  168. /* **************************************************************************************
  169. ReceiveCloseUser
  170. PURPOSE : 
  171. NOTE
  172.    ************************************************************************************** */
  173. void CGateInfo::ReceiveCloseUser(char *pszPacket)
  174. {
  175. int nSocket = AnsiStrToVal(pszPacket);
  176. }
  177. /* **************************************************************************************
  178. ReceiveSendUser
  179. PURPOSE : 
  180. NOTE
  181.    ************************************************************************************** */
  182. void CGateInfo::ReceiveSendUser(char *pszPacket)
  183. {
  184. char *pszPos;
  185. int nSocket;
  186. int nLen = memlen(pszPacket);
  187. if ((pszPos = (char *)memchr(pszPacket, '/', nLen)))
  188. {
  189. nSocket = AnsiStrToVal(pszPacket);
  190. pszPos++;
  191. _LPTSENDBUFF lpSendUserData = new _TSENDBUFF;
  192. lpSendUserData->sock = (SOCKET)nSocket;
  193. memmove(lpSendUserData->szData, pszPos, memlen(pszPos));
  194. g_SendToGateQ.PushQ((BYTE *)lpSendUserData);
  195. }
  196. }
  197. /* **************************************************************************************
  198. ProcSelectServer
  199. PURPOSE : 
  200. NOTE
  201.    ************************************************************************************** */
  202. void CGateInfo::ProcSelectServer(SOCKET s, WORD wServerIndex)
  203. {
  204. _TDEFAULTMESSAGE DefMsg;
  205. char szEncodePacket[128];
  206. char szEncodeAllPacket[256];
  207. char szEncodeMsg[24];
  208. char *pServerIP;
  209. GAMESERVERINFO *pServerInfo;
  210. PLISTNODE pListNode = xUserInfoList.GetHead();
  211. while (pListNode)
  212. {
  213. CUserInfo *pUserInfo = xUserInfoList.GetData(pListNode);
  214. if (pUserInfo->sock == s)
  215. {
  216. if (!pUserInfo->fSelServerOk)
  217. {
  218. fnMakeDefMessageA(&DefMsg, SM_SELECTSERVER_OK, 0, pUserInfo->nCertification, 0, 0);
  219. int nPos = fnEncodeMessageA(&DefMsg, szEncodeMsg, sizeof(szEncodePacket));
  220. szEncodeMsg[nPos] = '';
  221. for ( PLISTNODE pNode = g_xGameServerList.GetHead(); pNode; pNode = g_xGameServerList.GetNext( pNode ) )
  222. {
  223. pServerInfo = g_xGameServerList.GetData( pNode );
  224. if ( pServerInfo->index == wServerIndex )
  225. {
  226. pServerIP = pServerInfo->ip;
  227. pServerInfo->connCnt++;
  228. break;
  229. }
  230. }
  231. if ( !pServerIP )
  232. break;
  233. pUserInfo->nServerID = wServerIndex;
  234. int nPos2 = fnEncode6BitBufA((unsigned char *)pServerIP, szEncodePacket, memlen(pServerIP), sizeof(szEncodePacket));
  235. szEncodePacket[nPos2] = '';
  236. memmove(szEncodeAllPacket, szEncodeMsg, nPos);
  237. memmove(&szEncodeAllPacket[nPos], szEncodePacket, nPos2);
  238. szEncodeAllPacket[nPos + nPos2] = '';
  239. SendToGate(s, szEncodeAllPacket);
  240. pUserInfo->fSelServerOk = TRUE;
  241. pListNode = xUserInfoList.RemoveNode(pListNode);
  242. }
  243. }
  244. else
  245. pListNode = xUserInfoList.GetNext(pListNode);
  246. }
  247. }
  248. /* **************************************************************************************
  249. ParseUserEntry
  250. PURPOSE : 
  251. NOTE
  252.    ************************************************************************************** */
  253. bool CGateInfo::ParseUserEntry( char *buf, _AUSERENTRYINFO *userInfo )
  254. {
  255. char seps[] = "01";
  256. char *token = strtok( buf, seps );
  257. int  step   = 0;
  258. __try
  259. {
  260. while ( token )
  261. {
  262. switch ( step++ )
  263. {
  264. case 0: strcpy( userInfo->szLoginID, token );
  265. case 1: strcpy( userInfo->szPassword, token ); 
  266. case 2: strcpy( userInfo->szUserName, token );
  267. case 3: strcpy( userInfo->szSSNo, token );
  268. case 4: strcpy( userInfo->szBirthDay, token ); 
  269. case 5: strcpy( userInfo->szZipCode, token );
  270. case 6: strcpy( userInfo->szAddress1, token ); 
  271. case 7: strcpy( userInfo->szAddress2, token );
  272. case 8: strcpy( userInfo->szPhone, token ); 
  273. case 9: strcpy( userInfo->szMobilePhone, token ); 
  274. case 10: strcpy( userInfo->szEmail, token ); 
  275. case 11: strcpy( userInfo->szQuiz, token ); 
  276. case 12: strcpy( userInfo->szAnswer, token ); 
  277. case 13: strcpy( userInfo->szQuiz2, token ); 
  278. case 14: strcpy( userInfo->szAnswer2, token ); 
  279. }
  280. token = strtok( NULL, seps );
  281. }
  282. }
  283. __except ( EXCEPTION_EXECUTE_HANDLER )
  284. {
  285. return false;
  286. }
  287. return step >= 15;
  288. }
  289. /* **************************************************************************************
  290. ProcAddUser
  291. PURPOSE : 
  292. NOTE
  293.    ************************************************************************************** */
  294. void CGateInfo::ProcAddUser(SOCKET s, char *pszData)
  295. {
  296. char szEntryInfo[2048];
  297. _AUSERENTRYINFO UserEntryInfo;
  298. _TDEFAULTMESSAGE DefMsg;
  299. char szEncodePacket[64];
  300. int len = fnDecode6BitBufA(pszData, (char *)&szEntryInfo, sizeof(szEntryInfo));
  301. szEntryInfo[len] = '';
  302. if ( !ParseUserEntry( szEntryInfo, &UserEntryInfo ) )
  303. fnMakeDefMessageA(&DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0);
  304. else
  305. {
  306. char szQuery[1024];
  307. sprintf( szQuery, 
  308. "SELECT * FROM TBL_ACCOUNT WHERE FLD_LOGINID='%s'",
  309. UserEntryInfo.szLoginID );
  310. CRecordset *pRec = GetDBManager()->CreateRecordset();
  311. if (!pRec->Execute( szQuery ))
  312. fnMakeDefMessageA(&DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0);
  313. if ( pRec->Fetch() )
  314. fnMakeDefMessageA(&DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0);
  315. else
  316. {
  317. GetDBManager()->DestroyRecordset( pRec );
  318. pRec = GetDBManager()->CreateRecordset();
  319. sprintf( szQuery, 
  320. "INSERT TBL_ACCOUNT(FLD_LOGINID, FLD_PASSWORD, FLD_USERNAME, FLD_CERTIFICATION) "
  321. "VALUES( '%s', '%s', '%s', 0 )",
  322. UserEntryInfo.szLoginID, 
  323. UserEntryInfo.szPassword, 
  324. UserEntryInfo.szUserName );
  325. pRec->Execute( szQuery );
  326. sprintf( szQuery,
  327. "INSERT TBL_ACCOUNTADD(FLD_LOGINID, FLD_SSNO, FLD_BIRTHDAY, FLD_ADDRESS1, FLD_ADDRESS2, "
  328.                       "FLD_PHONE, FLD_MOBILEPHONE, FLD_EMAIL, FLD_QUIZ1, FLD_ANSWER1, FLD_QUIZ2, FLD_ANSWER2) "
  329. "VALUES( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
  330. UserEntryInfo.szLoginID,
  331. UserEntryInfo.szSSNo,
  332. UserEntryInfo.szBirthDay,
  333. UserEntryInfo.szAddress1,
  334. UserEntryInfo.szAddress2,
  335. UserEntryInfo.szPhone,
  336. UserEntryInfo.szMobilePhone,
  337. UserEntryInfo.szEmail,
  338. UserEntryInfo.szQuiz,
  339. UserEntryInfo.szAnswer,
  340. UserEntryInfo.szQuiz2,
  341. UserEntryInfo.szAnswer2 );
  342. pRec->Execute( szQuery );
  343. }
  344. GetDBManager()->DestroyRecordset( pRec );
  345. fnMakeDefMessageA(&DefMsg, SM_NEWID_SUCCESS, 0, 0, 0, 0);
  346. TCHAR szID[32];
  347. MultiByteToWideChar( CP_ACP, 0, UserEntryInfo.szLoginID, -1, szID, sizeof( szID ) / sizeof( TCHAR ) );
  348. InsertLogMsgParam(IDS_COMPLETENEWUSER, szID);
  349. }
  350. fnEncodeMessageA(&DefMsg, szEncodePacket, sizeof(szEncodePacket));
  351. SendToGate(s, szEncodePacket);
  352. }
  353. /* **************************************************************************************
  354. ProcLogin
  355. PURPOSE : 
  356. NOTE
  357.    ************************************************************************************** */
  358. void CGateInfo::ProcLogin(SOCKET s, char *pszData)
  359. {
  360. char szIDPassword[32];
  361. char *pszID, *pszPassword;
  362. char szEncodePacket[64];
  363. _TDEFAULTMESSAGE DefMsg;
  364. int nPos;
  365. char szQuery[256];
  366. if (memlen(pszData) - 1 <= 0) return;
  367. PLISTNODE pListNode = xUserInfoList.GetHead();
  368. while (pListNode)
  369. {
  370. CUserInfo *pUserInfo = xUserInfoList.GetData(pListNode);
  371. if (pUserInfo->sock == s)
  372. {
  373. int nDecodeLen = fnDecode6BitBufA(pszData, szIDPassword, sizeof(szIDPassword));
  374. szIDPassword[nDecodeLen] = '';
  375. pszID = &szIDPassword[0];
  376. if (pszPassword = (char *)memchr(szIDPassword, '/', sizeof(szIDPassword)))
  377. {
  378. *pszPassword = '';
  379. pszPassword++;
  380. sprintf( szQuery, "SELECT * FROM TBL_ACCOUNT WHERE FLD_LOGINID='%s'", pszID );
  381. CRecordset *pRec = GetDBManager()->CreateRecordset();
  382. if ( !pRec->Execute( szQuery ) || !pRec->Fetch() )
  383. fnMakeDefMessageA( &DefMsg, SM_ID_NOTFOUND, 0, 0, 0, 0 );
  384. else if ( CompareDBString( pszPassword, pRec->Get( "FLD_PASSWORD" ) ) != 0 )
  385. fnMakeDefMessageA( &DefMsg, SM_PASSWD_FAIL, 0, 0, 0, 0 );
  386. else
  387. {
  388. int nCertCode = atoi( pRec->Get( "FLD_CERTIFICATION" ) );
  389. /*
  390. if ( nCertCode > 0 && nCertCode < 30 )
  391. fnMakeDefMessageA(&DefMsg, SM_CERTIFICATION_FAIL, (nCertCode + 1), 0, 0, 0);
  392. else if ( nCertCode >= 30 )
  393. fnMakeDefMessageA(&DefMsg, SM_CERTIFICATION_FAIL, 1, 0, 0, 0);
  394. else*/
  395. {
  396. char szEncodeServerList[512];
  397. char szEncodeAllPacket[1024];
  398. fnMakeDefMessageA(&DefMsg, SM_PASSOK_SELECTSERVER, 0, 1, 0, 0);
  399. nPos = fnEncodeMessageA(&DefMsg, szEncodePacket, sizeof(szEncodePacket));
  400. szEncodePacket[nPos] = '';
  401. int nPos2 = fnEncode6BitBufA((unsigned char *)g_szServerList, szEncodeServerList, memlen(g_szServerList), sizeof(szEncodeServerList));
  402. szEncodeServerList[nPos2] = '';
  403. memmove(szEncodeAllPacket, szEncodePacket, nPos);
  404. memmove(&szEncodeAllPacket[nPos], szEncodeServerList, memlen(szEncodeServerList));
  405. SendToGate(s, szEncodeAllPacket);
  406. GetDBManager()->DestroyRecordset( pRec );
  407. pUserInfo->nCertification = GetCertification();
  408. // pRec = GetDBManager()->CreateRecordset();
  409. // sprintf( szQuery, 
  410. // "UPDATE TBL_ACCOUNT SET FLD_CERTIFICATION=%d WHERE FLD_LOGINID='%s'",
  411. // GetCertification(), pszID );
  412. // pRec->Execute( szQuery );
  413. // GetDBManager()->DestroyRecordset( pRec );
  414. return;
  415. }
  416. }
  417. GetDBManager()->DestroyRecordset( pRec );
  418. nPos = fnEncodeMessageA(&DefMsg, szEncodePacket, sizeof(szEncodePacket));
  419. szEncodePacket[nPos] = '';
  420. SendToGate(s, szEncodePacket);
  421. }
  422. }
  423. pListNode = xUserInfoList.GetNext(pListNode);
  424. }
  425. }