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

模拟服务器

开发平台:

C/C++

  1. //-----------------------------------------//
  2. //                                         //
  3. //  File : S3PDBSocketPool.cpp    //
  4. // Author : Yang Xiaodong            //
  5. // Modified : 8/26/2002                //
  6. //                                         //
  7. //-----------------------------------------//
  8. #include "S3PDBSocketPool.h"
  9. #include "regexpr2.h"
  10. using namespace std;
  11. using namespace regex;
  12. BOOL S3PDBSocketPool::m_bAccDBIsLocked = FALSE;
  13. static DWORD g_dwCount = 1; // Testing code
  14. static BOOL CALLBACK FreePoolData( DWORD data )
  15. {
  16. BOOL bRet = FALSE;
  17. S3PDBSocketPool::_LPDBSOCKETPOOLDATAPACKET lpData =
  18. ( S3PDBSocketPool::_LPDBSOCKETPOOLDATAPACKET )data;
  19. if ( NULL != lpData )
  20. {
  21. delete lpData;
  22. lpData = NULL;
  23. bRet = TRUE;
  24. }
  25. return bRet;
  26. }
  27. S3PDBSocketPool::S3PDBSocketPool():
  28. m_hProcessor( NULL ),
  29. m_dwProcessorThreadId( 0 ),
  30. m_piRunSignal( NULL ),
  31. m_hEnable( NULL ),
  32. m_Socket( INVALID_SOCKET )
  33. {
  34. m_piRunSignal = new int;
  35. *m_piRunSignal = 0;
  36. m_UDPs.NeedFreeData( FreePoolData );
  37. memset( &m_PoolParam, 0, sizeof( _DBSOCKETPOOLPARAM ) );
  38. }
  39. S3PDBSocketPool::~S3PDBSocketPool()
  40. {
  41. if ( NULL != m_piRunSignal )
  42. {
  43. delete m_piRunSignal;
  44. m_piRunSignal = NULL;
  45. }
  46. }
  47. static HANDLE g_hPoolMutex = NULL; // Testing code
  48. void S3PDBSocketPool::PushDataPacket(_LPDBSOCKETPOOLDATAPACKET lpData)
  49. {
  50. // Testing code
  51. //------>BEGIN
  52. if ( NULL == g_hPoolMutex )
  53. {
  54. g_hPoolMutex =
  55. KPICreateMutex( NULL, FALSE, "Socket pool's mutex" );
  56. }
  57. if ( NULL != g_hPoolMutex )
  58. {
  59. DWORD dwWaitResult;
  60. dwWaitResult =
  61. KPIWaitForSingleObject( g_hPoolMutex, INFINITE );
  62. if ( 1 == dwWaitResult )
  63. {
  64. __try
  65. {
  66. //<------END
  67. //m_UDPs.push_back( *lpData );
  68. _LPDBSOCKETPOOLDATAPACKET lpNewData = new _DBSOCKETPOOLDATAPACKET;
  69. if ( NULL != lpNewData )
  70. {
  71. *lpNewData = *lpData;
  72. m_UDPs.AddTail( ( DWORD )( lpNewData ) );
  73. if ( NULL != m_hEnable )
  74. {
  75. KPISetEvent( m_hEnable );
  76. }
  77. }
  78. // Testing code
  79. //------>BEGIN
  80. }
  81. __finally
  82.                 // Release ownership of the mutex object.
  83.                 if ( ! KPIReleaseMutex( g_hPoolMutex ) )
  84.                     // Deal with error.
  85.                 }
  86. }
  87. }
  88. }
  89. //<------END
  90. }
  91. BOOL S3PDBSocketPool::PopDataPacket( _DBSOCKETPOOLDATAPACKET& data )
  92. {
  93. BOOL bRet = FALSE;
  94. // Testing code
  95. //------>BEGIN
  96. if ( NULL == g_hPoolMutex )
  97. {
  98. g_hPoolMutex =
  99. KPICreateMutex( NULL, FALSE, "Socket pool's mutex" );
  100. }
  101. if ( NULL != g_hPoolMutex )
  102. {
  103. DWORD dwWaitResult;
  104. dwWaitResult =
  105. KPIWaitForSingleObject( g_hPoolMutex, INFINITE );
  106. if ( 1 == dwWaitResult )
  107. {
  108. __try
  109. {
  110. //<------END
  111. if ( !( m_UDPs.IsEmpty() ) )
  112. {
  113. DWORD headData = NULL;
  114. if ( TRUE == m_UDPs.GetHead( headData ) )
  115. {
  116. data = *( ( _LPDBSOCKETPOOLDATAPACKET )headData );
  117. m_UDPs.RemoveHead();
  118. }
  119. if ( ( m_UDPs.IsEmpty() )
  120. && ( NULL != m_hEnable ) )
  121. {
  122. KPIResetEvent( m_hEnable );
  123. }
  124. bRet = TRUE;
  125. }
  126. else if ( NULL != m_hEnable )
  127. {
  128. KPIResetEvent( m_hEnable );
  129. }
  130. // Testing code
  131. //------>BEGIN
  132. }
  133. __finally
  134.                 // Release ownership of the mutex object.
  135.                 if ( ! KPIReleaseMutex( g_hPoolMutex ) )
  136.                     // Deal with error.
  137.                 }
  138. }
  139. }
  140. }
  141. //<------END
  142. return bRet;
  143. }
  144. static DWORD WINAPI ProcessData( LPVOID lpParam )
  145. {
  146. DWORD dwRet = 0;
  147. if ( NULL == lpParam )
  148. {
  149. dwRet = 0;
  150. return dwRet;
  151. }
  152. S3PDBSocketPool::_LPDBSOCKETPOOLPARAM lpPoolParam =
  153. ( S3PDBSocketPool::_LPDBSOCKETPOOLPARAM )lpParam;
  154. if ( ( NULL == lpPoolParam->piRunSignal )
  155. || ( NULL == lpPoolParam->hEnableEvent )
  156. || ( NULL == lpPoolParam->pPool ) )
  157. {
  158. dwRet = 0;
  159. return dwRet;
  160. }
  161. S3PDBSocketPool* pPool = lpPoolParam->pPool;
  162. while ( 0 != *( lpPoolParam->piRunSignal ) )
  163. {
  164. DWORD dwResult =
  165. KPIWaitForSingleObject( lpPoolParam->hEnableEvent, INFINITE );
  166. if ( dwResult == 1 )
  167. {
  168. S3PDBSocketPool::_DBSOCKETPOOLDATAPACKET data;
  169. // Processes data
  170. //------>BEGIN
  171. if ( TRUE == pPool->PopDataPacket( data ) )
  172. {
  173. BOOL bResult = pPool->Process( &data );
  174. // Testing code
  175. //------>BEGIN
  176. if ( bResult )
  177. cout << "rn" << g_dwCount << " Successful";
  178. else
  179. cout << "rn" << g_dwCount << " Failed";
  180. g_dwCount++;
  181. //<------END
  182. }
  183. //<------END
  184. }
  185. }
  186. return dwRet;
  187. }
  188. HANDLE S3PDBSocketPool::Start()
  189. {
  190. HANDLE hRet = NULL;
  191. if ( ( NULL != m_hProcessor )
  192. || ( NULL == m_hEnable )
  193. || ( NULL == m_piRunSignal )
  194. || ( INVALID_SOCKET == m_Socket ) )
  195. {
  196. hRet = NULL;
  197. return hRet;
  198. }
  199. *m_piRunSignal = 1;
  200. m_PoolParam.hEnableEvent = m_hEnable;
  201. m_PoolParam.piRunSignal = m_piRunSignal;
  202. m_PoolParam.pPool = this;
  203. m_hProcessor =
  204. KPICreateThread( ProcessData, &m_PoolParam, &m_dwProcessorThreadId );
  205. hRet = m_hProcessor;
  206. return hRet;
  207. }
  208. BOOL S3PDBSocketPool::Stop()
  209. {
  210. BOOL bRet = FALSE;
  211. if ( ( NULL == m_hProcessor )
  212. || ( NULL == m_hEnable ) )
  213. {
  214. bRet = FALSE;
  215. return bRet;
  216. }
  217. *m_piRunSignal = 0;
  218. KPISetEvent( m_hEnable );
  219. DWORD dwResult = KPIWaitForSingleObject( m_hProcessor, 3000 );
  220. if ( 0 == dwResult )
  221. {
  222. bRet = FALSE;
  223. }
  224. else if ( 1 == dwResult )
  225. {
  226. bRet = TRUE;
  227. }
  228. else if ( 2 == dwResult ) // Time out.
  229. {
  230. if ( TRUE == KPITerminateThread( m_hProcessor, 0 ) )
  231. {
  232. bRet = TRUE;
  233. }
  234. else
  235. {
  236. bRet = FALSE;
  237. }
  238. }
  239. return bRet;
  240. }
  241. void S3PDBSocketPool::Init( SOCKET s, HANDLE hEnableEvent )
  242. {
  243. m_Socket = s;
  244. m_hEnable = hEnableEvent;
  245. }
  246. BOOL S3PDBSocketPool::ProMsgWhenLocked( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  247. {
  248. BOOL bRet = FALSE;
  249. if ( NULL != lpcParsedData )
  250. {
  251. IBYTE feedBuf[def_UDPSIZE];
  252. memset( feedBuf, 0, def_UDPSIZE );
  253. feedBuf[0] = LOGIN_R_TAG;
  254. DWORD dwSize = sizeof( KLoginAccountInfo );
  255. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  256. DWORD dwParam = LOGIN_R_LOGIN;
  257. if ( ( LOGIN_ACCOUNT_MAX_LEN + 2 + LOGIN_PASSWORD_MAX_LEN + 2 )
  258. == lpcParsedData->m_dwSize )
  259. {
  260. S3PAccount account;
  261. char szAccount[LOGIN_ACCOUNT_MAX_LEN+2];
  262. szAccount[LOGIN_ACCOUNT_MAX_LEN] = 0;
  263. char szPassword[LOGIN_PASSWORD_MAX_LEN+2];
  264. szPassword[LOGIN_PASSWORD_MAX_LEN] = 0;
  265. DWORD dwOffset = 0;
  266. memcpy( szAccount,
  267. lpcParsedData->m_lpData + dwOffset,
  268. LOGIN_ACCOUNT_MAX_LEN );
  269. dwOffset += LOGIN_ACCOUNT_MAX_LEN + 2;
  270. memcpy( szPassword,
  271. lpcParsedData->m_lpData + dwOffset,
  272. LOGIN_PASSWORD_MAX_LEN );
  273. dwOffset += LOGIN_PASSWORD_MAX_LEN + 2;
  274. dwParam |= LOGIN_R_ACCDBISLOCKED;
  275. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  276. memcpy( &feedBuf[1+sizeof( KLoginStructHead )],
  277. szAccount, LOGIN_ACCOUNT_MAX_LEN + 2 );
  278. memcpy( &feedBuf[1+sizeof( KLoginStructHead )+LOGIN_ACCOUNT_MAX_LEN+2],
  279. szPassword, LOGIN_PASSWORD_MAX_LEN + 2 );
  280. unsigned long ulSize = dwSize + 1;
  281. unsigned long ulEncodedSize;
  282. if ( TRUE == S3PDBSocketParser::Encode( feedBuf, ulSize, NULL, ulEncodedSize ) )
  283. {
  284. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  285. if ( NULL != pEncodedBuf )
  286. {
  287. S3PDBSocketParser::Encode( feedBuf, ulSize, pEncodedBuf, ulEncodedSize );
  288. bRet =
  289. SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  290. delete []pEncodedBuf;
  291. pEncodedBuf = NULL;
  292. }
  293. }
  294. }
  295. }
  296. return bRet;
  297. }
  298. BOOL S3PDBSocketPool::ProAddAccount( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  299. {
  300. assert( NULL != lpcParsedData );
  301. BOOL bRet = FALSE;
  302. IBYTE feedBuf[1+KLOGINSTRUCTHEADSIZE];
  303. feedBuf[0] = LOGIN_R_TAG;
  304. DWORD dwSize = KLOGINSTRUCTHEADSIZE;
  305. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  306. DWORD dwParam = LOGIN_R_NEWACCOUNT;
  307. if ( ( LOGIN_ACCOUNT_MAX_LEN + 2
  308. + LOGIN_PASSWORD_MAX_LEN + 2
  309. + LOGIN_REALNAME_MAX_LEN + 2 )
  310. == lpcParsedData->m_dwSize )
  311. {
  312. char szAccount[LOGIN_ACCOUNT_MAX_LEN+2];
  313. szAccount[LOGIN_ACCOUNT_MAX_LEN] = 0;
  314. char szPassword[LOGIN_PASSWORD_MAX_LEN+2];
  315. szPassword[LOGIN_PASSWORD_MAX_LEN] = 0;
  316. char szRealName[LOGIN_REALNAME_MAX_LEN+2];
  317. szRealName[LOGIN_REALNAME_MAX_LEN] = 0;
  318. DWORD dwOffset = 0;
  319. memcpy( szAccount,
  320. lpcParsedData->m_lpData + dwOffset,
  321. LOGIN_ACCOUNT_MAX_LEN + 2 );
  322. dwOffset += LOGIN_ACCOUNT_MAX_LEN + 2;
  323. memcpy( szPassword,
  324. lpcParsedData->m_lpData + dwOffset,
  325. LOGIN_PASSWORD_MAX_LEN + 2 );
  326. dwOffset += LOGIN_PASSWORD_MAX_LEN + 2;
  327. memcpy( szRealName,
  328. lpcParsedData->m_lpData + dwOffset,
  329. LOGIN_REALNAME_MAX_LEN + 2 );
  330. int iResult = S3PAccount::AddAccount( szAccount, szPassword, szRealName );
  331. switch ( iResult )
  332. {
  333. case 1:
  334. dwParam |= LOGIN_R_SUCCESS;
  335. break;
  336. case -4:
  337. dwParam |= LOGIN_R_ACCOUNT_EXIST;
  338. break;
  339. default:
  340. dwParam |= LOGIN_R_FAILED;
  341. break;
  342. }
  343. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  344. //bRet = SendUDP( dwTargetIP, iTargetPort, feedBuf, 1 + KLOGINSTRUCTHEADSIZE );
  345. unsigned long ulEncodedSize;
  346. if ( TRUE == S3PDBSocketParser::Encode( feedBuf,
  347. 1 + KLOGINSTRUCTHEADSIZE, NULL, ulEncodedSize ) )
  348. {
  349. IBYTE* pEncodedFeedBuf = new IBYTE[ulEncodedSize];
  350. if ( NULL != pEncodedFeedBuf )
  351. {
  352. S3PDBSocketParser::Encode( feedBuf, 1 + KLOGINSTRUCTHEADSIZE,
  353. pEncodedFeedBuf, ulEncodedSize );
  354. bRet =
  355. SendUDP( dwTargetIP, iTargetPort,
  356. pEncodedFeedBuf, ulEncodedSize );
  357. delete []pEncodedFeedBuf;
  358. pEncodedFeedBuf = NULL;
  359. }
  360. }
  361. }
  362. else
  363. {
  364. dwParam |= LOGIN_R_FAILED;
  365. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  366. bRet =
  367. SendUDP( dwTargetIP, iTargetPort, feedBuf, 1 + KLOGINSTRUCTHEADSIZE );
  368. }
  369. return bRet;
  370. }
  371. BOOL S3PDBSocketPool::ProLoginFromGame( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  372. {
  373. BOOL bRet = FALSE;
  374. if ( NULL != lpcParsedData )
  375. {
  376. IBYTE feedBuf[def_UDPSIZE];
  377. memset( feedBuf, 0, def_UDPSIZE );
  378. feedBuf[0] = LOGIN_R_TAG;
  379. DWORD dwSize = sizeof( KLoginAccountInfo );
  380. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  381. DWORD dwParam = LOGIN_R_LOGIN;
  382. if ( ( LOGIN_ACCOUNT_MAX_LEN + 2 + LOGIN_PASSWORD_MAX_LEN + 2 )
  383. == lpcParsedData->m_dwSize )
  384. {
  385. S3PAccount account;
  386. char szAccount[LOGIN_ACCOUNT_MAX_LEN+2];
  387. szAccount[LOGIN_ACCOUNT_MAX_LEN] = 0;
  388. char szPassword[LOGIN_PASSWORD_MAX_LEN+2];
  389. szPassword[LOGIN_PASSWORD_MAX_LEN] = 0;
  390. DWORD dwOffset = 0;
  391. memcpy( szAccount,
  392. lpcParsedData->m_lpData + dwOffset,
  393. LOGIN_ACCOUNT_MAX_LEN );
  394. dwOffset += LOGIN_ACCOUNT_MAX_LEN + 2;
  395. memcpy( szPassword,
  396. lpcParsedData->m_lpData + dwOffset,
  397. LOGIN_PASSWORD_MAX_LEN );
  398. dwOffset += LOGIN_PASSWORD_MAX_LEN + 2;
  399. int iResult = S3PAccount::Login( szAccount, szPassword );
  400. if ( 1 == iResult )
  401. {
  402. dwParam |= LOGIN_R_SUCCESS;
  403. }
  404. else if ( -4 == iResult )
  405. {
  406. dwParam |= LOGIN_R_NOTREGISTERED;
  407. }
  408. else
  409. {
  410. dwParam |= LOGIN_R_FAILED;
  411. }
  412. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  413. memcpy( &feedBuf[1+sizeof( KLoginStructHead )],
  414. szAccount, LOGIN_ACCOUNT_MAX_LEN + 2 );
  415. memcpy( &feedBuf[1+sizeof( KLoginStructHead )+LOGIN_ACCOUNT_MAX_LEN+2],
  416. szPassword, LOGIN_PASSWORD_MAX_LEN + 2 );
  417. unsigned long ulSize = dwSize + 1;
  418. unsigned long ulEncodedSize;
  419. if ( TRUE == S3PDBSocketParser::Encode( feedBuf, ulSize, NULL, ulEncodedSize ) )
  420. {
  421. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  422. if ( NULL != pEncodedBuf )
  423. {
  424. S3PDBSocketParser::Encode( feedBuf, ulSize, pEncodedBuf, ulEncodedSize );
  425. bRet =
  426. SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  427. delete []pEncodedBuf;
  428. pEncodedBuf = NULL;
  429. }
  430. }
  431. }
  432. }
  433. return bRet;
  434. }
  435. BOOL S3PDBSocketPool::ProLogoutFromGame( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  436. {
  437. assert( NULL != lpcParsedData );
  438. BOOL bRet = FALSE;
  439. IBYTE feedBuf[def_UDPSIZE];
  440. memset( feedBuf, 0, def_UDPSIZE );
  441. feedBuf[0] = LOGIN_R_TAG;
  442. DWORD dwSize = sizeof( KLoginAccountInfo );
  443. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  444. DWORD dwParam = LOGIN_R_LOGOUT;
  445. if ( ( LOGIN_ACCOUNT_MAX_LEN + 2 + LOGIN_PASSWORD_MAX_LEN + 2 + sizeof( DWORD ) )
  446. == lpcParsedData->m_dwSize )
  447. {
  448. S3PAccount account;
  449. char szAccount[LOGIN_ACCOUNT_MAX_LEN+2];
  450. szAccount[LOGIN_ACCOUNT_MAX_LEN] = 0;
  451. char szPassword[LOGIN_PASSWORD_MAX_LEN+2];
  452. szPassword[LOGIN_PASSWORD_MAX_LEN] = 0;
  453. DWORD dwGameID = 0;
  454. DWORD dwOffset = 0;
  455. memcpy( szAccount,
  456. lpcParsedData->m_lpData + dwOffset,
  457. LOGIN_ACCOUNT_MAX_LEN );
  458. dwOffset += LOGIN_ACCOUNT_MAX_LEN + 2;
  459. memcpy( szPassword,
  460. lpcParsedData->m_lpData + dwOffset,
  461. LOGIN_PASSWORD_MAX_LEN );
  462. dwOffset += LOGIN_PASSWORD_MAX_LEN + 2;
  463. memcpy( &dwGameID,
  464. lpcParsedData->m_lpData + dwOffset,
  465. sizeof( DWORD ) );
  466. dwOffset += sizeof( DWORD );
  467. int iResult = S3PAccount::Logout( szAccount, szPassword, dwGameID );
  468. switch ( iResult )
  469. {
  470. case 1:
  471. dwParam |= LOGIN_R_SUCCESS;
  472. break;
  473. default:
  474. dwParam |= LOGIN_R_FAILED;
  475. break;
  476. }
  477. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  478. memcpy( &feedBuf[1+sizeof( KLoginStructHead )],
  479. szAccount, LOGIN_ACCOUNT_MAX_LEN + 2 );
  480. memcpy( &feedBuf[1+sizeof( KLoginStructHead )+LOGIN_ACCOUNT_MAX_LEN+2],
  481. szPassword, LOGIN_PASSWORD_MAX_LEN + 2 );
  482. unsigned long ulSize = sizeof( KLoginAccountInfo ) + 1;
  483. unsigned long ulEncodedSize;
  484. if ( TRUE == S3PDBSocketParser::Encode( feedBuf, ulSize, NULL, ulEncodedSize ) )
  485. {
  486. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  487. if ( NULL != pEncodedBuf )
  488. {
  489. S3PDBSocketParser::Encode( feedBuf, ulSize, pEncodedBuf, ulEncodedSize );
  490. bRet =
  491. SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  492. delete []pEncodedBuf;
  493. pEncodedBuf = NULL;
  494. }
  495. }
  496. }
  497. return bRet;
  498. }
  499. BOOL S3PDBSocketPool::ProReportFromGame( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  500. {
  501. assert( NULL != lpcParsedData );
  502. BOOL bRet = FALSE;
  503. IBYTE feedBuf[def_UDPSIZE];
  504. memset( feedBuf, 0, def_UDPSIZE );
  505. feedBuf[0] = LOGIN_R_TAG;
  506. DWORD dwSize = sizeof( KLoginAccountInfo );
  507. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  508. DWORD dwParam = LOGIN_R_REPORT;
  509. if ( ( LOGIN_ACCOUNT_MAX_LEN + 2 + LOGIN_PASSWORD_MAX_LEN + 2 + sizeof( DWORD ) )
  510. == lpcParsedData->m_dwSize )
  511. {
  512. S3PAccount account;
  513. char szAccount[LOGIN_ACCOUNT_MAX_LEN+2];
  514. szAccount[LOGIN_ACCOUNT_MAX_LEN] = 0;
  515. char szPassword[LOGIN_PASSWORD_MAX_LEN+2];
  516. szPassword[LOGIN_PASSWORD_MAX_LEN] = 0; 
  517. DWORD dwGameID = 0;
  518. DWORD dwOffset = 0;
  519. memcpy( szAccount,
  520. lpcParsedData->m_lpData + dwOffset,
  521. LOGIN_ACCOUNT_MAX_LEN );
  522. dwOffset += LOGIN_ACCOUNT_MAX_LEN + 2;
  523. memcpy( szPassword,
  524. lpcParsedData->m_lpData + dwOffset,
  525. LOGIN_PASSWORD_MAX_LEN );
  526. dwOffset += LOGIN_PASSWORD_MAX_LEN + 2;
  527. memcpy( &dwGameID,
  528. &( lpcParsedData->m_lpData[LOGIN_ACCOUNT_MAX_LEN+LOGIN_PASSWORD_MAX_LEN] ),
  529. sizeof( DWORD ) );
  530. dwOffset += sizeof( DWORD );
  531. int iResult = S3PAccount::Report( szAccount, szPassword, dwGameID );
  532. switch ( iResult )
  533. {
  534. case 1:
  535. dwParam |= LOGIN_R_SUCCESS;
  536. break;
  537. case -3:
  538. dwParam |= LOGIN_R_BEDISCONNECTED;
  539. break;
  540. case -4:
  541. dwParam |= LOGIN_R_NOTREGISTERED;
  542. break;
  543. default:
  544. dwParam |= LOGIN_R_FAILED;
  545. break;
  546. }
  547. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  548. memcpy( &feedBuf[1+sizeof( KLoginStructHead )],
  549. szAccount, LOGIN_ACCOUNT_MAX_LEN + 2 );
  550. memcpy( &feedBuf[1+sizeof( KLoginStructHead )+LOGIN_ACCOUNT_MAX_LEN+2],
  551. szPassword, LOGIN_PASSWORD_MAX_LEN + 2 );
  552. unsigned long ulSize = sizeof( KLoginAccountInfo ) + 1;
  553. unsigned long ulEncodedSize;
  554. if ( TRUE == S3PDBSocketParser::Encode( feedBuf, ulSize, NULL, ulEncodedSize ) )
  555. {
  556. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  557. if ( NULL != pEncodedBuf )
  558. {
  559. S3PDBSocketParser::Encode( feedBuf, ulSize, pEncodedBuf, ulEncodedSize );
  560. bRet =
  561. SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  562. delete []pEncodedBuf;
  563. pEncodedBuf = NULL;
  564. }
  565. }
  566. }
  567. return bRet;
  568. }
  569. BOOL S3PDBSocketPool::ProQueryGameserverList( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  570. {
  571. BOOL bRet = FALSE;
  572. if ( NULL != lpcParsedData )
  573. {
  574. IBYTE feedBuf[def_UDPSIZE*10];
  575. memset( feedBuf, 0, def_UDPSIZE * 10 );
  576. feedBuf[0] = LOGIN_R_TAG;
  577. DWORD dwSize = sizeof( KLoginAccountInfo );
  578. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  579. DWORD dwParam = LOGIN_R_LOGIN;
  580. if ( ( LOGIN_ACCOUNT_MAX_LEN + 2 + LOGIN_PASSWORD_MAX_LEN + 2 )
  581. == lpcParsedData->m_dwSize )
  582. {
  583. char szAccount[LOGIN_ACCOUNT_MAX_LEN + 2 ];
  584. szAccount[LOGIN_ACCOUNT_MAX_LEN] = 0;
  585. char szPassword[LOGIN_PASSWORD_MAX_LEN+1];
  586. szPassword[LOGIN_PASSWORD_MAX_LEN] = 0; 
  587. memcpy( szAccount,
  588. lpcParsedData->m_lpData,
  589. LOGIN_ACCOUNT_MAX_LEN );
  590. memcpy( szPassword,
  591. &( lpcParsedData->m_lpData[LOGIN_ACCOUNT_MAX_LEN] ),
  592. LOGIN_PASSWORD_MAX_LEN );
  593. S3PAccount account;
  594. DWORD dwSizeTemp = 0;
  595. IBYTE* pFeedBuf = feedBuf;
  596. IBYTE* pLastFeedBuf = NULL;
  597. int iResult =
  598. account.QueryGameserverList( szAccount, szPassword, NULL, dwSizeTemp );
  599. BOOL bFixedMemory = TRUE;
  600. if ( 1 == iResult )
  601. {
  602. pFeedBuf = new IBYTE[dwSizeTemp+dwSize+1];
  603. if ( NULL != pFeedBuf )
  604. {
  605. memcpy( pFeedBuf, feedBuf, dwSize + 1 );
  606. dwSize += dwSizeTemp;
  607. memcpy( &( pFeedBuf[1] ), &dwSize, sizeof( DWORD ) );
  608. account.QueryGameserverList( szAccount, szPassword,
  609. &( pFeedBuf[dwSize+1] ), dwSizeTemp );
  610. bFixedMemory = FALSE;
  611. }
  612. else
  613. {
  614. pFeedBuf = feedBuf;
  615. dwParam |= LOGIN_R_FAILED;
  616. }
  617. }
  618. else
  619. {
  620. dwParam |= LOGIN_R_FAILED;
  621. }
  622. memcpy( &pFeedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  623. memcpy( &pFeedBuf[1+sizeof( KLoginStructHead )],
  624. szAccount, LOGIN_ACCOUNT_MAX_LEN + 2 );
  625. memcpy( &pFeedBuf[1+sizeof( KLoginStructHead )+LOGIN_ACCOUNT_MAX_LEN+2],
  626. szPassword, LOGIN_PASSWORD_MAX_LEN + 2 );
  627. unsigned long ulSize = dwSize + 1;
  628. unsigned long ulEncodedSize;
  629. if ( TRUE == S3PDBSocketParser::Encode( feedBuf, ulSize, NULL, ulEncodedSize ) )
  630. {
  631. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  632. if ( NULL != pEncodedBuf )
  633. {
  634. S3PDBSocketParser::Encode( feedBuf, ulSize, pEncodedBuf, ulEncodedSize );
  635. bRet =
  636. SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  637. delete []pEncodedBuf;
  638. pEncodedBuf = NULL;
  639. }
  640. }
  641. if ( ( !bFixedMemory ) && ( NULL != pFeedBuf ) )
  642. {
  643. delete []pFeedBuf;
  644. pFeedBuf = NULL;
  645. }
  646. }
  647. }
  648. return bRet;
  649. }
  650. BOOL S3PDBSocketPool::ProBeginGame( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  651. {
  652. BOOL bRet = FALSE;
  653. if ( NULL != lpcParsedData )
  654. {
  655. IBYTE feedBuf[def_UDPSIZE];
  656. memset( feedBuf, 0, def_UDPSIZE );
  657. feedBuf[0] = LOGIN_R_TAG;
  658. DWORD dwSize = sizeof( KLoginAccountInfo );
  659. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  660. DWORD dwParam = LOGIN_R_BEGINGAME;
  661. if ( ( LOGIN_ACCOUNT_MAX_LEN + 2 + LOGIN_PASSWORD_MAX_LEN + 2 + sizeof( DWORD ) )
  662. == lpcParsedData->m_dwSize )
  663. {
  664. S3PAccount account;
  665. char szAccount[LOGIN_ACCOUNT_MAX_LEN+2];
  666. szAccount[LOGIN_ACCOUNT_MAX_LEN] = 0;
  667. char szPassword[LOGIN_PASSWORD_MAX_LEN+2];
  668. szPassword[LOGIN_PASSWORD_MAX_LEN] = 0;
  669. DWORD dwGameID = 0;
  670. DWORD dwOffset = 0;
  671. memcpy( szAccount,
  672. lpcParsedData->m_lpData + dwOffset,
  673. LOGIN_ACCOUNT_MAX_LEN );
  674. dwOffset += LOGIN_ACCOUNT_MAX_LEN + 2;
  675. memcpy( szPassword,
  676. lpcParsedData->m_lpData + dwOffset,
  677. LOGIN_PASSWORD_MAX_LEN );
  678. dwOffset += LOGIN_PASSWORD_MAX_LEN + 2;
  679. memcpy( &dwGameID,
  680. lpcParsedData->m_lpData + dwOffset,
  681. sizeof( DWORD ) );
  682. dwOffset += sizeof( DWORD );
  683. int iResult = S3PAccount::Login( szAccount, szPassword, dwGameID );
  684. if ( 1 == iResult )
  685. {
  686. dwParam |= LOGIN_R_SUCCESS;
  687. }
  688. else if ( -4 == iResult )
  689. {
  690. dwParam |= LOGIN_R_NOTREGISTERED;
  691. }
  692. else
  693. {
  694. dwParam |= LOGIN_R_FAILED;
  695. }
  696. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  697. memcpy( &feedBuf[1+sizeof( KLoginStructHead )],
  698. szAccount, LOGIN_ACCOUNT_MAX_LEN + 2 );
  699. memcpy( &feedBuf[1+sizeof( KLoginStructHead )+LOGIN_ACCOUNT_MAX_LEN+2],
  700. szPassword, LOGIN_PASSWORD_MAX_LEN + 2 );
  701. unsigned long ulSize = dwSize + 1;
  702. unsigned long ulEncodedSize;
  703. if ( TRUE == S3PDBSocketParser::Encode( feedBuf, ulSize, NULL, ulEncodedSize ) )
  704. {
  705. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  706. if ( NULL != pEncodedBuf )
  707. {
  708. S3PDBSocketParser::Encode( feedBuf, ulSize, pEncodedBuf, ulEncodedSize );
  709. bRet =
  710. SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  711. delete []pEncodedBuf;
  712. pEncodedBuf = NULL;
  713. }
  714. }
  715. }
  716. }
  717. return bRet;
  718. }
  719. BOOL S3PDBSocketPool::ProDBLogin( DWORD dwTargetIP, INT iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  720. {
  721. BOOL bRet = FALSE;
  722. if ( NULL != lpcParsedData )
  723. {
  724. if ( ( sizeof( GUID ) + sizeof( _DBLOGINSTRUCT ) - sizeof( KLoginStructHead ) )
  725. == lpcParsedData->m_dwSize )
  726. {
  727. char szUserName[def_DBUSERNAME_MAX_LEN+1];
  728. szUserName[def_DBUSERNAME_MAX_LEN] = 0;
  729. char szPassword[def_DBPASSWORD_MAX_LEN+1];
  730. szPassword[def_DBPASSWORD_MAX_LEN] = 0;
  731. struct sockaddr_in targetAddr;
  732. targetAddr.sin_family = AF_INET;
  733. targetAddr.sin_addr.s_addr = dwTargetIP;
  734. targetAddr.sin_port = htons( ( short )iTargetPort );
  735. GUID msgID;
  736. memcpy( szUserName,
  737. lpcParsedData->m_lpData,
  738. def_DBUSERNAME_MAX_LEN );
  739. memcpy( szPassword,
  740. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN] ),
  741. def_DBPASSWORD_MAX_LEN );
  742. memcpy( &msgID,
  743. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN + def_DBPASSWORD_MAX_LEN] ),
  744. sizeof( GUID ) );
  745. char* lpszTargetIP = inet_ntoa( targetAddr.sin_addr );
  746. IBYTE feedBuf[def_UDPSIZE];
  747. feedBuf[0] = LOGIN_R_TAG;
  748. DWORD dwSize = sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  749. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  750. memcpy( &feedBuf[1+sizeof( DWORD )*2],
  751. &szUserName, def_DBUSERNAME_MAX_LEN );
  752. memcpy( &feedBuf[1+sizeof( DWORD )*2+def_DBUSERNAME_MAX_LEN],
  753. &szPassword, def_DBPASSWORD_MAX_LEN );
  754. memcpy( &feedBuf[1+sizeof( _DBLOGINSTRUCT )], &msgID, sizeof( GUID ) );
  755. DWORD dwParam = DBLOGIN_R_LOGIN;
  756. int iResult =
  757. S3PAccount::DBLogin( szUserName, szPassword, lpszTargetIP );
  758. if ( 1 == iResult ) // Successful
  759. {
  760. dwParam |= DBLOGIN_R_SUCCESS;
  761. }
  762. else if ( -4 == iResult ) // User has logged in
  763. {
  764. dwParam |= DBLOGIN_R_HASLOGGEDIN;
  765. }
  766. else // Failed to logged in
  767. {
  768. dwParam |= DBLOGIN_R_FAILED;
  769. }
  770. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  771. unsigned long ulFeedSize = 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  772. unsigned long ulEncodedSize;
  773. if ( TRUE ==
  774. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, NULL, ulEncodedSize ) )
  775. {
  776. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  777. if ( NULL != pEncodedBuf )
  778. {
  779. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, pEncodedBuf, ulEncodedSize );
  780. bRet = SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  781. delete []pEncodedBuf;
  782. pEncodedBuf = NULL;
  783. }
  784. }
  785. }
  786. else
  787. {
  788. // No operation here
  789. }
  790. }
  791. return bRet;
  792. }
  793. BOOL S3PDBSocketPool::ProDBLogout( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  794. {
  795. BOOL bRet = FALSE;
  796. if ( NULL != lpcParsedData )
  797. {
  798. if ( ( sizeof( GUID ) + sizeof( _DBLOGINSTRUCT ) - sizeof( KLoginStructHead ) )
  799. == lpcParsedData->m_dwSize )
  800. {
  801. char szUserName[def_DBUSERNAME_MAX_LEN+1];
  802. szUserName[def_DBUSERNAME_MAX_LEN] = 0;
  803. char szPassword[def_DBPASSWORD_MAX_LEN+1];
  804. szPassword[def_DBPASSWORD_MAX_LEN] = 0;
  805. GUID msgID;
  806. memcpy( szUserName,
  807. lpcParsedData->m_lpData,
  808. def_DBUSERNAME_MAX_LEN );
  809. memcpy( szPassword,
  810. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN] ),
  811. def_DBPASSWORD_MAX_LEN );
  812. memcpy( &msgID,
  813. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN + def_DBPASSWORD_MAX_LEN] ),
  814. sizeof( GUID ) );
  815. IBYTE feedBuf[def_UDPSIZE];
  816. feedBuf[0] = LOGIN_R_TAG;
  817. DWORD dwSize = sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  818. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  819. memcpy( &feedBuf[1+sizeof( DWORD )*2],
  820. &szUserName, def_DBUSERNAME_MAX_LEN );
  821. memcpy( &feedBuf[1+sizeof( DWORD )*2+def_DBUSERNAME_MAX_LEN],
  822. &szPassword, def_DBPASSWORD_MAX_LEN );
  823. memcpy( &feedBuf[1+sizeof( _DBLOGINSTRUCT )], &msgID, sizeof( GUID ) );
  824. DWORD dwParam = DBLOGIN_R_LOGOUT;
  825. int iResult =
  826. S3PAccount::DBLogout( szUserName, szPassword );
  827. if ( 1 == iResult ) // Successful
  828. {
  829. dwParam |= DBLOGIN_R_SUCCESS;
  830. }
  831. else // Failed to logged out
  832. {
  833. dwParam |= DBLOGIN_R_FAILED;
  834. }
  835. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  836. unsigned long ulFeedSize = 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  837. unsigned long ulEncodedSize;
  838. if ( TRUE ==
  839. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, NULL, ulEncodedSize ) )
  840. {
  841. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  842. if ( NULL != pEncodedBuf )
  843. {
  844. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, pEncodedBuf, ulEncodedSize );
  845. bRet = SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  846. delete []pEncodedBuf;
  847. pEncodedBuf = NULL;
  848. }
  849. }
  850. }
  851. else
  852. {
  853. // No operation here
  854. }
  855. }
  856. return bRet;
  857. }
  858. BOOL S3PDBSocketPool::ProDBQueryUserList( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  859. {
  860. BOOL bRet = FALSE;
  861. if ( NULL != lpcParsedData )
  862. {
  863. if ( ( sizeof( GUID ) + sizeof( _DBLOGINSTRUCT ) - sizeof( KLoginStructHead ) )
  864. == lpcParsedData->m_dwSize )
  865. {
  866. char szUserName[def_DBUSERNAME_MAX_LEN+1];
  867. szUserName[def_DBUSERNAME_MAX_LEN] = 0;
  868. char szPassword[def_DBPASSWORD_MAX_LEN+1];
  869. szPassword[def_DBPASSWORD_MAX_LEN] = 0;
  870. GUID msgID;
  871. memcpy( szUserName,
  872. lpcParsedData->m_lpData,
  873. def_DBUSERNAME_MAX_LEN );
  874. memcpy( szPassword,
  875. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN] ),
  876. def_DBPASSWORD_MAX_LEN );
  877. memcpy( &msgID,
  878. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN + def_DBPASSWORD_MAX_LEN] ),
  879. sizeof( GUID ) );
  880. IBYTE feedBuf[def_UDPSIZE];
  881. IBYTE* pLastFeedBuf = NULL;
  882. feedBuf[0] = LOGIN_R_TAG;
  883. DWORD dwSize = sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  884. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  885. memcpy( &feedBuf[1+sizeof( DWORD )*2],
  886. &szUserName, def_DBUSERNAME_MAX_LEN );
  887. memcpy( &feedBuf[1+sizeof( DWORD )*2+def_DBUSERNAME_MAX_LEN],
  888. &szPassword, def_DBPASSWORD_MAX_LEN );
  889. memcpy( &feedBuf[1+sizeof( _DBLOGINSTRUCT )], &msgID, sizeof( GUID ) );
  890. DWORD dwParam = DBLOGIN_R_QUERYUSERLIST;
  891. DWORD dwUserListSize = 0;
  892. int iResult =
  893. S3PAccount::DBQueryUserList( szUserName,
  894. szPassword, NULL, dwUserListSize );
  895. BOOL bFeedBufIsFixed = TRUE;
  896. if ( 1 == iResult )
  897. {
  898. if ( 0 == dwUserListSize )
  899. {
  900. pLastFeedBuf = feedBuf;
  901. dwParam |= DBLOGIN_R_SUCCESS;
  902. }
  903. else
  904. {
  905. pLastFeedBuf =
  906. new IBYTE[1+sizeof( _DBLOGINSTRUCT )+sizeof( GUID )+dwUserListSize];
  907. if ( NULL != pLastFeedBuf )
  908. {
  909. bFeedBufIsFixed = FALSE;
  910. dwSize += dwUserListSize;
  911. memcpy( pLastFeedBuf, feedBuf, 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID ) );
  912. memcpy( &pLastFeedBuf[1], &dwSize, sizeof( DWORD ) );
  913. dwParam |= DBLOGIN_R_SUCCESS;
  914. S3PAccount::DBQueryUserList( szUserName, szPassword,
  915. &( pLastFeedBuf[1+sizeof( _DBLOGINSTRUCT )+sizeof( GUID )] ),
  916. dwUserListSize );
  917. }
  918. else
  919. {
  920. pLastFeedBuf = feedBuf;
  921. dwParam |= DBLOGIN_R_FAILED;
  922. }
  923. }
  924. }
  925. else
  926. {
  927. pLastFeedBuf = feedBuf;
  928. dwParam |= DBLOGIN_R_FAILED;
  929. }
  930. memcpy( &pLastFeedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  931. unsigned long ulFeedSize =
  932. 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID ) + dwUserListSize;
  933. unsigned long ulEncodedSize;
  934. if ( TRUE ==
  935. S3PDBSocketParser::Encode( pLastFeedBuf, ulFeedSize, NULL, ulEncodedSize ) )
  936. {
  937. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  938. if ( NULL != pEncodedBuf )
  939. {
  940. S3PDBSocketParser::Encode( pLastFeedBuf, ulFeedSize, pEncodedBuf, ulEncodedSize );
  941. bRet = SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  942. delete []pEncodedBuf;
  943. pEncodedBuf = NULL;
  944. }
  945. }
  946. if ( !bFeedBufIsFixed )
  947. {
  948. delete []pLastFeedBuf;
  949. pLastFeedBuf = NULL;
  950. }
  951. }
  952. }
  953. return bRet;
  954. }
  955. BOOL S3PDBSocketPool::ProDBLock( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  956. {
  957. BOOL bRet = FALSE;
  958. if ( NULL != lpcParsedData )
  959. {
  960. if ( ( sizeof( GUID ) + sizeof( _DBLOGINSTRUCT ) - sizeof( KLoginStructHead ) )
  961. == lpcParsedData->m_dwSize )
  962. {
  963. char szUserName[def_DBUSERNAME_MAX_LEN+1];
  964. szUserName[def_DBUSERNAME_MAX_LEN] = 0;
  965. char szPassword[def_DBPASSWORD_MAX_LEN+1];
  966. szPassword[def_DBPASSWORD_MAX_LEN] = 0;
  967. GUID msgID;
  968. memcpy( szUserName,
  969. lpcParsedData->m_lpData,
  970. def_DBUSERNAME_MAX_LEN );
  971. memcpy( szPassword,
  972. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN] ),
  973. def_DBPASSWORD_MAX_LEN );
  974. memcpy( &msgID,
  975. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN + def_DBPASSWORD_MAX_LEN] ),
  976. sizeof( GUID ) );
  977. IBYTE feedBuf[def_UDPSIZE];
  978. feedBuf[0] = LOGIN_R_TAG;
  979. DWORD dwSize = sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  980. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  981. memcpy( &feedBuf[1+sizeof( DWORD )*2],
  982. &szUserName, def_DBUSERNAME_MAX_LEN );
  983. memcpy( &feedBuf[1+sizeof( DWORD )*2+def_DBUSERNAME_MAX_LEN],
  984. &szPassword, def_DBPASSWORD_MAX_LEN );
  985. memcpy( &feedBuf[1+sizeof( _DBLOGINSTRUCT )], &msgID, sizeof( GUID ) );
  986. DWORD dwParam = DBLOGIN_R_LOCKDATABASE;
  987. int iResult =
  988. S3PAccount::DBLock( szUserName, szPassword );
  989. if ( 1 == iResult ) // Successful
  990. {
  991. m_bAccDBIsLocked = TRUE;
  992. dwParam |= DBLOGIN_R_SUCCESS;
  993. }
  994. else // Failed to lock account database
  995. {
  996. dwParam |= DBLOGIN_R_FAILED;
  997. }
  998. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  999. unsigned long ulFeedSize = 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1000. unsigned long ulEncodedSize;
  1001. if ( TRUE ==
  1002. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, NULL, ulEncodedSize ) )
  1003. {
  1004. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  1005. if ( NULL != pEncodedBuf )
  1006. {
  1007. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, pEncodedBuf, ulEncodedSize );
  1008. bRet = SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  1009. delete []pEncodedBuf;
  1010. pEncodedBuf = NULL;
  1011. }
  1012. }
  1013. }
  1014. else
  1015. {
  1016. // No operation here
  1017. }
  1018. }
  1019. return bRet;
  1020. }
  1021. BOOL S3PDBSocketPool::ProDBActivate( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  1022. {
  1023. BOOL bRet = FALSE;
  1024. if ( NULL != lpcParsedData )
  1025. {
  1026. if ( ( sizeof( GUID ) + sizeof( _DBLOGINSTRUCT ) - sizeof( KLoginStructHead ) )
  1027. == lpcParsedData->m_dwSize )
  1028. {
  1029. char szUserName[def_DBUSERNAME_MAX_LEN+1];
  1030. szUserName[def_DBUSERNAME_MAX_LEN] = 0;
  1031. char szPassword[def_DBPASSWORD_MAX_LEN+1];
  1032. szPassword[def_DBPASSWORD_MAX_LEN] = 0;
  1033. GUID msgID;
  1034. memcpy( szUserName,
  1035. lpcParsedData->m_lpData,
  1036. def_DBUSERNAME_MAX_LEN );
  1037. memcpy( szPassword,
  1038. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN] ),
  1039. def_DBPASSWORD_MAX_LEN );
  1040. memcpy( &msgID,
  1041. &( lpcParsedData->m_lpData[def_DBUSERNAME_MAX_LEN + def_DBPASSWORD_MAX_LEN] ),
  1042. sizeof( GUID ) );
  1043. IBYTE feedBuf[def_UDPSIZE];
  1044. feedBuf[0] = LOGIN_R_TAG;
  1045. DWORD dwSize = sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1046. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  1047. memcpy( &feedBuf[1+sizeof( DWORD )*2],
  1048. &szUserName, def_DBUSERNAME_MAX_LEN );
  1049. memcpy( &feedBuf[1+sizeof( DWORD )*2+def_DBUSERNAME_MAX_LEN],
  1050. &szPassword, def_DBPASSWORD_MAX_LEN );
  1051. memcpy( &feedBuf[1+sizeof( _DBLOGINSTRUCT )], &msgID, sizeof( GUID ) );
  1052. DWORD dwParam = DBLOGIN_R_ACTIVATEDATABASE;
  1053. int iResult =
  1054. S3PAccount::DBActivate( szUserName, szPassword );
  1055. if ( 1 == iResult ) // Successful
  1056. {
  1057. m_bAccDBIsLocked = TRUE;
  1058. dwParam |= DBLOGIN_R_SUCCESS;
  1059. }
  1060. else // Failed to activate account database
  1061. {
  1062. dwParam |= DBLOGIN_R_FAILED;
  1063. }
  1064. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  1065. unsigned long ulFeedSize = 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1066. unsigned long ulEncodedSize;
  1067. if ( TRUE ==
  1068. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, NULL, ulEncodedSize ) )
  1069. {
  1070. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  1071. if ( NULL != pEncodedBuf )
  1072. {
  1073. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, pEncodedBuf, ulEncodedSize );
  1074. bRet = SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  1075. delete []pEncodedBuf;
  1076. pEncodedBuf = NULL;
  1077. }
  1078. }
  1079. }
  1080. else
  1081. {
  1082. // No operation here
  1083. }
  1084. }
  1085. return bRet;
  1086. }
  1087. BOOL S3PDBSocketPool::ProDBAddUser( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  1088. {
  1089. BOOL bRet = FALSE;
  1090. if ( NULL != lpcParsedData )
  1091. {
  1092. if ( ( sizeof( GUID ) + sizeof( _DBLOGINSTRUCT )
  1093.  + def_DBUSERNAME_MAX_LEN + def_DBPASSWORD_MAX_LEN
  1094.  + sizeof( short int )
  1095.  - sizeof( KLoginStructHead ) )
  1096. == lpcParsedData->m_dwSize )
  1097. {
  1098. char szUserName[def_DBUSERNAME_MAX_LEN+2];
  1099. szUserName[def_DBUSERNAME_MAX_LEN] = 0;
  1100. char szPassword[def_DBPASSWORD_MAX_LEN+2];
  1101. szPassword[def_DBPASSWORD_MAX_LEN] = 0;
  1102. char szNewUserName[def_DBUSERNAME_MAX_LEN+2];
  1103. szNewUserName[def_DBUSERNAME_MAX_LEN] = 0;
  1104. char szNewUserPassword[def_DBPASSWORD_MAX_LEN+2];
  1105. szNewUserPassword[def_DBPASSWORD_MAX_LEN] = 0;
  1106. short int siNewUserPriority = 0;
  1107. GUID msgID;
  1108. DWORD dwOffset = 0;
  1109. memcpy( szUserName,
  1110. lpcParsedData->m_lpData,
  1111. def_DBUSERNAME_MAX_LEN );
  1112. dwOffset += def_DBUSERNAME_MAX_LEN;
  1113. memcpy( szPassword,
  1114. lpcParsedData->m_lpData + dwOffset,
  1115. def_DBPASSWORD_MAX_LEN );
  1116. dwOffset += def_DBPASSWORD_MAX_LEN;
  1117. memcpy( szNewUserName,
  1118. lpcParsedData->m_lpData + dwOffset,
  1119. def_DBUSERNAME_MAX_LEN );
  1120. dwOffset += def_DBUSERNAME_MAX_LEN;
  1121. memcpy( szNewUserPassword,
  1122. lpcParsedData->m_lpData + dwOffset,
  1123. def_DBPASSWORD_MAX_LEN );
  1124. dwOffset += def_DBPASSWORD_MAX_LEN;
  1125. memcpy( &siNewUserPriority,
  1126. lpcParsedData->m_lpData + dwOffset,
  1127. sizeof( short int ) );
  1128. dwOffset += sizeof( short int );
  1129. memcpy( &msgID,
  1130. lpcParsedData->m_lpData + dwOffset,
  1131. sizeof( GUID ) );
  1132. IBYTE feedBuf[def_UDPSIZE];
  1133. feedBuf[0] = LOGIN_R_TAG;
  1134. DWORD dwSize = sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1135. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  1136. memcpy( &feedBuf[1+sizeof( DWORD )*2],
  1137. &szUserName, def_DBUSERNAME_MAX_LEN );
  1138. memcpy( &feedBuf[1+sizeof( DWORD )*2+def_DBUSERNAME_MAX_LEN],
  1139. &szPassword, def_DBPASSWORD_MAX_LEN );
  1140. memcpy( &feedBuf[1+sizeof( _DBLOGINSTRUCT )], &msgID, sizeof( GUID ) );
  1141. DWORD dwParam = DBLOGIN_R_ADDDBUSER;
  1142. int iResult =
  1143. S3PAccount::DBAddUser( szUserName, szPassword,
  1144. szNewUserName, szNewUserPassword, siNewUserPriority );
  1145. if ( 1 == iResult ) // Successful
  1146. {
  1147. dwParam |= DBLOGIN_R_SUCCESS;
  1148. }
  1149. else if ( -6 == iResult )
  1150. {
  1151. dwParam |= DBLOGIN_R_HASNOENOUGHPRIORITY;
  1152. }
  1153. else if ( -7 == iResult )
  1154. {
  1155. dwParam |= DBLOGIN_R_USERHASEXISTED;
  1156. }
  1157. else // Failed to activate account database
  1158. {
  1159. dwParam |= DBLOGIN_R_FAILED;
  1160. }
  1161. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  1162. unsigned long ulFeedSize = 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1163. unsigned long ulEncodedSize;
  1164. if ( TRUE ==
  1165. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, NULL, ulEncodedSize ) )
  1166. {
  1167. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  1168. if ( NULL != pEncodedBuf )
  1169. {
  1170. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, pEncodedBuf, ulEncodedSize );
  1171. bRet = SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  1172. delete []pEncodedBuf;
  1173. pEncodedBuf = NULL;
  1174. }
  1175. }
  1176. }
  1177. else
  1178. {
  1179. // No operation here
  1180. }
  1181. }
  1182. return bRet;
  1183. }
  1184. BOOL S3PDBSocketPool::ProDBDeleteUser( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  1185. {
  1186. BOOL bRet = FALSE;
  1187. if ( NULL != lpcParsedData )
  1188. {
  1189. if ( ( sizeof( GUID ) + sizeof( _DBLOGINSTRUCT )
  1190.  + def_DBUSERNAME_MAX_LEN
  1191.  - sizeof( KLoginStructHead ) )
  1192. == lpcParsedData->m_dwSize )
  1193. {
  1194. char szUserName[def_DBUSERNAME_MAX_LEN+2];
  1195. szUserName[def_DBUSERNAME_MAX_LEN] = 0;
  1196. char szPassword[def_DBPASSWORD_MAX_LEN+2];
  1197. szPassword[def_DBPASSWORD_MAX_LEN] = 0;
  1198. char szSelUserName[def_DBUSERNAME_MAX_LEN+2];
  1199. szSelUserName[def_DBUSERNAME_MAX_LEN] = 0;
  1200. GUID msgID;
  1201. DWORD dwOffset = 0;
  1202. memcpy( szUserName,
  1203. lpcParsedData->m_lpData,
  1204. def_DBUSERNAME_MAX_LEN );
  1205. dwOffset += def_DBUSERNAME_MAX_LEN;
  1206. memcpy( szPassword,
  1207. lpcParsedData->m_lpData + dwOffset,
  1208. def_DBPASSWORD_MAX_LEN );
  1209. dwOffset += def_DBPASSWORD_MAX_LEN;
  1210. memcpy( szSelUserName,
  1211. lpcParsedData->m_lpData + dwOffset,
  1212. def_DBUSERNAME_MAX_LEN );
  1213. dwOffset += def_DBUSERNAME_MAX_LEN;
  1214. memcpy( &msgID,
  1215. lpcParsedData->m_lpData + dwOffset,
  1216. sizeof( GUID ) );
  1217. IBYTE feedBuf[def_UDPSIZE];
  1218. feedBuf[0] = LOGIN_R_TAG;
  1219. DWORD dwSize = sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1220. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  1221. memcpy( &feedBuf[1+sizeof( DWORD )*2],
  1222. &szUserName, def_DBUSERNAME_MAX_LEN );
  1223. memcpy( &feedBuf[1+sizeof( DWORD )*2+def_DBUSERNAME_MAX_LEN],
  1224. &szPassword, def_DBPASSWORD_MAX_LEN );
  1225. memcpy( &feedBuf[1+sizeof( _DBLOGINSTRUCT )], &msgID, sizeof( GUID ) );
  1226. DWORD dwParam = DBLOGIN_R_DELDBUSER;
  1227. int iResult =
  1228. S3PAccount::DBDeleteUser( szUserName, szPassword, szSelUserName );
  1229. if ( 1 == iResult ) // Successful
  1230. {
  1231. dwParam |= DBLOGIN_R_SUCCESS;
  1232. }
  1233. else if ( -4 == iResult )
  1234. {
  1235. dwParam |= DBLOGIN_R_HASNOENOUGHPRIORITY;
  1236. }
  1237. else // Failed to activate account database
  1238. {
  1239. dwParam |= DBLOGIN_R_FAILED;
  1240. }
  1241. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  1242. unsigned long ulFeedSize = 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1243. unsigned long ulEncodedSize;
  1244. if ( TRUE ==
  1245. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, NULL, ulEncodedSize ) )
  1246. {
  1247. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  1248. if ( NULL != pEncodedBuf )
  1249. {
  1250. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, pEncodedBuf, ulEncodedSize );
  1251. bRet = SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  1252. delete []pEncodedBuf;
  1253. pEncodedBuf = NULL;
  1254. }
  1255. }
  1256. }
  1257. else
  1258. {
  1259. // No operation here
  1260. }
  1261. }
  1262. return bRet;
  1263. }
  1264. BOOL S3PDBSocketPool::ProDBCreateAccount( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  1265. {
  1266. BOOL bRet = FALSE;
  1267. if ( NULL != lpcParsedData )
  1268. {
  1269. if ( ( sizeof( GUID ) + sizeof( _DBLOGINSTRUCT )
  1270.  + LOGIN_REALNAME_MAX_LEN
  1271.  + LOGIN_PASSWORD_MAX_LEN
  1272.  + LOGIN_ACCOUNT_MAX_LEN
  1273.  - sizeof( KLoginStructHead ) )
  1274. == lpcParsedData->m_dwSize )
  1275. {
  1276. char szUserName[def_DBUSERNAME_MAX_LEN+2];
  1277. szUserName[def_DBUSERNAME_MAX_LEN] = 0;
  1278. char szPassword[def_DBPASSWORD_MAX_LEN+2];
  1279. szPassword[def_DBPASSWORD_MAX_LEN] = 0;
  1280. char szAccRealName[LOGIN_REALNAME_MAX_LEN+2];
  1281. szAccRealName[LOGIN_REALNAME_MAX_LEN] = 0;
  1282. char szAccPassword[LOGIN_PASSWORD_MAX_LEN+2];
  1283. szAccPassword[LOGIN_PASSWORD_MAX_LEN] = 0;
  1284. char szAccName[LOGIN_ACCOUNT_MAX_LEN+2];
  1285. szAccName[LOGIN_ACCOUNT_MAX_LEN] = 0;
  1286. GUID msgID;
  1287. DWORD dwOffset = 0;
  1288. memcpy( szUserName,
  1289. lpcParsedData->m_lpData,
  1290. def_DBUSERNAME_MAX_LEN );
  1291. dwOffset += def_DBUSERNAME_MAX_LEN;
  1292. memcpy( szPassword,
  1293. lpcParsedData->m_lpData + dwOffset,
  1294. def_DBPASSWORD_MAX_LEN );
  1295. dwOffset += def_DBPASSWORD_MAX_LEN;
  1296. memcpy( szAccRealName,
  1297. lpcParsedData->m_lpData + dwOffset,
  1298. LOGIN_REALNAME_MAX_LEN );
  1299. dwOffset += LOGIN_REALNAME_MAX_LEN;
  1300. memcpy( szAccPassword,
  1301. lpcParsedData->m_lpData + dwOffset,
  1302. LOGIN_PASSWORD_MAX_LEN );
  1303. dwOffset += LOGIN_PASSWORD_MAX_LEN;
  1304. memcpy( szAccName,
  1305. lpcParsedData->m_lpData + dwOffset,
  1306. LOGIN_ACCOUNT_MAX_LEN );
  1307. dwOffset += LOGIN_ACCOUNT_MAX_LEN;
  1308. memcpy( &msgID,
  1309. lpcParsedData->m_lpData + dwOffset,
  1310. sizeof( GUID ) );
  1311. IBYTE feedBuf[def_UDPSIZE];
  1312. feedBuf[0] = LOGIN_R_TAG;
  1313. DWORD dwSize = sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1314. memcpy( &feedBuf[1], &dwSize, sizeof( DWORD ) );
  1315. memcpy( &feedBuf[1+sizeof( DWORD )*2],
  1316. &szUserName, def_DBUSERNAME_MAX_LEN );
  1317. memcpy( &feedBuf[1+sizeof( DWORD )*2+def_DBUSERNAME_MAX_LEN],
  1318. &szPassword, def_DBPASSWORD_MAX_LEN );
  1319. memcpy( &feedBuf[1+sizeof( _DBLOGINSTRUCT )], &msgID, sizeof( GUID ) );
  1320. DWORD dwParam = DBLOGIN_R_CREATEACCOUNT;
  1321. int iResult =
  1322. S3PAccount::DBCreateAccount( szUserName, szPassword,
  1323. szAccRealName, szAccPassword, szAccName );
  1324. if ( 1 == iResult )
  1325. {
  1326. dwParam |= DBLOGIN_R_SUCCESS;
  1327. }
  1328. else if ( -6 == iResult )
  1329. {
  1330. dwParam |= DBLOGIN_R_HASNOENOUGHPRIORITY;
  1331. }
  1332. else
  1333. {
  1334. dwParam |= DBLOGIN_R_FAILED;
  1335. }
  1336. memcpy( &feedBuf[1+sizeof( DWORD )], &dwParam, sizeof( DWORD ) );
  1337. unsigned long ulFeedSize = 1 + sizeof( _DBLOGINSTRUCT ) + sizeof( GUID );
  1338. unsigned long ulEncodedSize;
  1339. if ( TRUE ==
  1340. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, NULL, ulEncodedSize ) )
  1341. {
  1342. IBYTE* pEncodedBuf = new IBYTE[ulEncodedSize];
  1343. if ( NULL != pEncodedBuf )
  1344. {
  1345. S3PDBSocketParser::Encode( feedBuf, ulFeedSize, pEncodedBuf, ulEncodedSize );
  1346. bRet = SendUDP( dwTargetIP, iTargetPort, pEncodedBuf, ulEncodedSize );
  1347. delete []pEncodedBuf;
  1348. pEncodedBuf = NULL;
  1349. }
  1350. }
  1351. }
  1352. else
  1353. {
  1354. // No operation here
  1355. }
  1356. }
  1357. return bRet;
  1358. }
  1359. BOOL S3PDBSocketPool::Distribute( DWORD dwTargetIP, int iTargetPort, _LPCPARSEDDATAPACKET lpcParsedData )
  1360. {
  1361. assert( NULL != lpcParsedData );
  1362. BOOL bRet = FALSE;
  1363. switch( lpcParsedData->m_dwParam )
  1364. {
  1365. case LOGIN_A_LOGIN:
  1366. if ( m_bAccDBIsLocked )
  1367. bRet = ProMsgWhenLocked( dwTargetIP, iTargetPort, lpcParsedData );
  1368. else
  1369. bRet = ProLoginFromGame( dwTargetIP, iTargetPort, lpcParsedData );
  1370. break;
  1371. case LOGIN_A_NEWACCOUNT:
  1372. if ( m_bAccDBIsLocked )
  1373. bRet = ProMsgWhenLocked( dwTargetIP, iTargetPort, lpcParsedData );
  1374. else
  1375. bRet = ProAddAccount( dwTargetIP, iTargetPort, lpcParsedData );
  1376. break;
  1377. case LOGIN_A_REPORT:
  1378. if ( m_bAccDBIsLocked )
  1379. bRet = ProMsgWhenLocked( dwTargetIP, iTargetPort, lpcParsedData );
  1380. else
  1381. bRet = ProReportFromGame( dwTargetIP, iTargetPort, lpcParsedData );
  1382. break;
  1383. case LOGIN_A_LOGOUT:
  1384. if ( m_bAccDBIsLocked )
  1385. bRet = ProMsgWhenLocked( dwTargetIP, iTargetPort, lpcParsedData );
  1386. else
  1387. bRet = ProLogoutFromGame( dwTargetIP, iTargetPort, lpcParsedData );
  1388. break;
  1389. case LOGIN_A_SERVERLIST:
  1390. if ( m_bAccDBIsLocked )
  1391. bRet = ProMsgWhenLocked( dwTargetIP, iTargetPort, lpcParsedData );
  1392. else
  1393. bRet = ProQueryGameserverList( dwTargetIP, iTargetPort, lpcParsedData );
  1394. bRet = FALSE;
  1395. break;
  1396. case LOGIN_A_BEGINGAME:
  1397. if ( m_bAccDBIsLocked )
  1398. bRet = ProMsgWhenLocked( dwTargetIP, iTargetPort, lpcParsedData );
  1399. else
  1400. bRet = ProBeginGame( dwTargetIP, iTargetPort, lpcParsedData );
  1401. bRet = FALSE;
  1402. break;
  1403. case DBLOGIN_A_LOGIN:
  1404. bRet = ProDBLogin( dwTargetIP, iTargetPort, lpcParsedData );
  1405. break;
  1406. case DBLOGIN_A_LOGOUT:
  1407. bRet = ProDBLogout( dwTargetIP, iTargetPort, lpcParsedData );
  1408. break;
  1409. case DBLOGIN_A_QUERYUSERLIST:
  1410. bRet = ProDBQueryUserList( dwTargetIP, iTargetPort, lpcParsedData );
  1411. break;
  1412. case DBLOGIN_A_LOCKDATABASE:
  1413. bRet = ProDBLock( dwTargetIP, iTargetPort, lpcParsedData );
  1414. break;
  1415. case DBLOGIN_A_ACTIVATEDATABASE:
  1416. bRet = ProDBActivate( dwTargetIP, iTargetPort, lpcParsedData );
  1417. break;
  1418. case DBLOGIN_A_ADDDBUSER:
  1419. bRet = ProDBAddUser( dwTargetIP, iTargetPort, lpcParsedData );
  1420. break;
  1421. case DBLOGIN_A_DELDBUSER:
  1422. bRet = ProDBDeleteUser( dwTargetIP, iTargetPort, lpcParsedData );
  1423. break;
  1424. case DBLOGIN_A_CREATEACCOUNT:
  1425. bRet = ProDBCreateAccount( dwTargetIP, iTargetPort, lpcParsedData );
  1426. break;
  1427. default:
  1428. break;
  1429. }
  1430. return bRet;
  1431. }
  1432. BOOL S3PDBSocketPool::Process( _LPDBSOCKETPOOLDATAPACKET lpData )
  1433. {
  1434. BOOL bRet = FALSE;
  1435. if ( NULL != lpData )
  1436. {
  1437. DWORD dwTargetIP = lpData->dwFromIP;
  1438. int iTargetPort = lpData->iFromPort;
  1439. S3PDBSocketParser parser;
  1440. if ( TRUE == parser.Parse( lpData->dataBuf, lpData->dwSize ) )
  1441. {
  1442. bRet = Distribute( dwTargetIP, iTargetPort, &parser );
  1443. }
  1444. }
  1445. return bRet;
  1446. }
  1447. BOOL S3PDBSocketPool::SendUDP( DWORD dwTargetIP, int iTargetPort, IBYTE* pBuf, DWORD dwSize )
  1448. {
  1449. BOOL bRet = FALSE;
  1450. SOCKADDR_IN targetAddr;
  1451. targetAddr.sin_family = AF_INET;
  1452. targetAddr.sin_port = htons( ( short )( iTargetPort ) );
  1453. targetAddr.sin_addr.s_addr = dwTargetIP;
  1454. int iResult = sendto( m_Socket,
  1455. pBuf,
  1456. dwSize,
  1457. 0,
  1458. ( SOCKADDR* )( &targetAddr ),
  1459. sizeof( targetAddr ) );
  1460. if ( SOCKET_ERROR == iResult )
  1461. {
  1462. bRet = FALSE;
  1463. }
  1464. else
  1465. {
  1466. bRet = TRUE;
  1467. }
  1468. return bRet;
  1469. }
  1470. BOOL S3PDBSocketPool::SendError( DWORD dwTargetIP, int iTargetPort )
  1471. {
  1472. BOOL bRet = FALSE;
  1473. IBYTE sendBuf[KLOGINSTRUCTHEADSIZE+1];
  1474. sendBuf[0] = LOGIN_R_TAG;
  1475. DWORD dwSize = KLOGINSTRUCTHEADSIZE;
  1476. DWORD dwParam = LOGIN_R_FAILED;
  1477. memcpy( &( sendBuf[1] ), &dwSize, sizeof( DWORD ) );
  1478. memcpy( &( sendBuf[1+sizeof( DWORD )] ), &dwParam, sizeof( DWORD ) );
  1479. bRet = SendUDP( dwTargetIP, iTargetPort, sendBuf, KLOGINSTRUCTHEADSIZE + 1 );
  1480. return bRet;
  1481. }