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

模拟服务器

开发平台:

C/C++

  1. // Global.cpp: implementation of the CGlobal class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Global.h"
  6. #include "S3Relay.h"
  7. #include <map>
  8. #include "../../../Headers/inoutmac.h"
  9. #include "DoScript.h"
  10. //////////////////////////////////////////////////////////////////////
  11. //////////////////////////////////////////////////////////////////////
  12. const _localmask = 0x0000FFFF;
  13. const _localtag = 0x0000A8C0;
  14. const DWORD delay_reclient = 30000;
  15. ////////////
  16. //variants
  17. CMemory g_memory;
  18. CHeavenLib g_libHeaven;
  19. CRainbowLib g_libRainbow;
  20. CSockThread g_threadSock;
  21. CRelayCenter g_RelayCenter;
  22. CRelayServer g_RelayServer;
  23. CRootCenter g_RootCenter;
  24. CRootClient g_RootClient(&g_RootCenter, FALSE);
  25. CDBCenter g_DBCenter;
  26. CDBClient g_DBClient(&g_DBCenter, FALSE);
  27. CGatewayCenter g_GatewayCenter;
  28. CGatewayClient g_GatewayClient(&g_GatewayCenter, FALSE);
  29. CHostServer g_HostServer;
  30. CTongServer g_TongServer;
  31. CChatServer g_ChatServer;
  32. CChannelMgr g_ChannelMgr;
  33. CFriendMgr g_FriendMgr;
  34. CTongSet g_cTongSet;
  35. //////////////////////////////////////////////////
  36. const char file_relaycfg[] = "relay_config.ini";
  37. const char sec_gateway[] = "gateway";
  38. const char sec_relay[] = "relay";
  39. const char sec_root[] = "root";
  40. const char sec_host[] = "host";
  41. const char sec_tong[] = "tong";
  42. const char sec_chat[] = "chat";
  43. const char sec_dbrole[] = "dbrole";
  44. const char key_ip[] = "ip";
  45. const char key_address[] = "address";
  46. const char key_playercnt[] = "playercnt";
  47. const char key_precision[] = "precision";
  48. const char key_freebuffer[] = "freebuffer";
  49. const char key_buffersize[] = "buffersize";
  50. const char key_account[] = "account";
  51. const char key_password[] = "password";
  52. const char key_retryinterval[] = "retryinterval";
  53. /////////////////////////////////////////////////
  54. static gs_reclient_enable = FALSE;
  55. static UINT gs_timerRoot = 0;
  56. static UINT gs_timerGateway = 0;
  57. static UINT gs_timerDB = 0;
  58. static UINT gs_timerFriendUdtDB = 0;
  59. /////////////////////////////////////////////////
  60. HWND gGetMainWnd();
  61. HWND gGetListBox();
  62. /////////////////////////////////////////////////
  63. // functions
  64. std::_tstring gGetLocateDirectory()
  65. {
  66. static struct _LOCALDIR
  67. {
  68. std::_tstring path;
  69. _LOCALDIR()
  70. {
  71. TCHAR buff[_MAX_PATH] = {0};
  72. ::GetModuleFileName(NULL, buff, _MAX_PATH);
  73. TCHAR* pCh = _tcsrchr(buff, _T('\'));
  74. assert(pCh);
  75. *(pCh + 1) = 0;
  76. path = buff;
  77. assert(!path.empty());
  78. }
  79. } s_locdir;
  80. return s_locdir.path;
  81. }
  82. std::_tstring gGetPrivateProfileStringEx(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpFileName, LPCSTR lpDefault)
  83. {
  84. std::_tstring path = gGetLocateDirectory() + lpFileName;
  85. TCHAR buffer[_MAX_PATH] = {0};
  86. ::GetPrivateProfileString(lpAppName, lpKeyName, lpDefault, buffer, _MAX_PATH, path.c_str());
  87. return buffer;
  88. }
  89. INT gGetPrivateProfileIntEx(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpFileName, INT nDefault)
  90. {
  91. std::_tstring path = gGetLocateDirectory() + lpFileName;
  92. return ::GetPrivateProfileInt(lpAppName, lpKeyName, nDefault, path.c_str());
  93. }
  94. TCHAR gGetPrivateProfileCharEx(LPCSTR lpAppName, LPCSTR lpKeyName, LPCSTR lpFileName, TCHAR chDefault)
  95. {
  96. std::_tstring theStr = ::gGetPrivateProfileStringEx(lpAppName, lpKeyName, lpFileName);
  97. return theStr.empty() ? chDefault : theStr[0];
  98. }
  99. const std::vector<std::_tstring>& gGetPrivateProfileSectionEx(LPCTSTR lpAppName, LPCTSTR lpFileName)
  100. {
  101. std::_tstring path = gGetLocateDirectory() + lpFileName;
  102. static std::vector<std::_tstring> s_vecstr;
  103. s_vecstr.clear();
  104. const DWORD MAX_BUFFSIZE = 4096;
  105. char buff[MAX_BUFFSIZE];
  106. DWORD cch = ::GetPrivateProfileSection(lpAppName, buff, MAX_BUFFSIZE, path.c_str());
  107. for (char* pc = buff; *pc != 0; pc += strlen(pc))
  108. s_vecstr.push_back(pc);
  109. return s_vecstr;
  110. }
  111. const std::vector<std::_tstring>& gGetPrivateProfileSectionNamesEx(LPCTSTR lpFileName)
  112. {
  113. std::_tstring path = gGetLocateDirectory() + lpFileName;
  114. static std::vector<std::_tstring> s_vecstr;
  115. s_vecstr.clear();
  116. const DWORD MAX_BUFFSIZE = 4096;
  117. char buff[MAX_BUFFSIZE];
  118. DWORD cch = ::GetPrivateProfileSectionNames(buff, MAX_BUFFSIZE, path.c_str());
  119. for (char* pc = buff; *pc != 0; pc += s_vecstr.back().size())
  120. s_vecstr.push_back(pc);
  121. return s_vecstr;
  122. }
  123. BOOL gInitialize()
  124. {
  125. InitScript();
  126. gs_reclient_enable = TRUE;
  127. //check the netcard, need 1 at least
  128. if (gGetMacAndIPAddress(NULL, NULL, NULL, NULL, _localtag, 0) <= 0)
  129. return FALSE;
  130. if (!g_memory.Initialize())
  131. return FALSE;
  132. if (!g_libHeaven.Initialize())
  133. return FALSE;
  134. if (!g_libRainbow.Initialize())
  135. return FALSE;
  136. if (!g_ChannelMgr.Initialize())
  137. return FALSE;
  138. if (!g_FriendMgr.Initialize())
  139. return FALSE;
  140. const size_t playercntRelay = gGetPrivateProfileIntEx(sec_relay, key_playercnt, file_relaycfg, 0);
  141. const size_t precisionRelay = gGetPrivateProfileIntEx(sec_relay, key_precision, file_relaycfg, 0);
  142. const size_t freebufferRelay = gGetPrivateProfileIntEx(sec_relay, key_freebuffer, file_relaycfg, 0);
  143. const size_t buffersizeRelay = gGetPrivateProfileIntEx(sec_relay, key_buffersize, file_relaycfg, 0);
  144. const DWORD listenaddrRelay = INADDR_ANY;
  145. const unsigned short listenportRelay = RELAY_SIBLING_PORT;
  146. if (!g_RelayCenter.Initialize())
  147. return FALSE;
  148. if (!g_RelayServer.Startup(playercntRelay, precisionRelay, freebufferRelay, buffersizeRelay, listenaddrRelay, listenportRelay))
  149. {
  150. rTRACE("FAIL: relay server");
  151. //return FALSE;
  152. }
  153. const size_t freebufferRoot = gGetPrivateProfileIntEx(sec_root, key_freebuffer, file_relaycfg, 0);
  154. const size_t buffersizeRoot = gGetPrivateProfileIntEx(sec_root, key_buffersize, file_relaycfg, 0);
  155. std::_tstring addrRoot = gGetPrivateProfileStringEx(sec_root, key_address, file_relaycfg);
  156. const unsigned short portRoot = RELAY_ROUTE_PORT;
  157. if (!g_RootCenter.Initialize())
  158. return FALSE;
  159. if (!g_RootClient.Startup(freebufferRoot, buffersizeRoot, addrRoot.c_str(), portRoot))
  160. {
  161. rTRACE("FAIL: root client - %s", addrRoot.c_str());
  162. gOnOneClientClose(oneclient_root);
  163. //return FALSE;
  164. }
  165. const size_t freebufferDB = gGetPrivateProfileIntEx(sec_dbrole, key_freebuffer, file_relaycfg, 0);
  166. const size_t buffersizeDB = gGetPrivateProfileIntEx(sec_dbrole, key_buffersize, file_relaycfg, 0);
  167. std::_tstring addrDB = gGetPrivateProfileStringEx(sec_dbrole, key_address, file_relaycfg);
  168. const unsigned short portDB = ROLEDBSVR_ROLEDB_PORT;
  169. if (!g_DBCenter.Initialize())
  170. return FALSE;
  171. if (!g_DBClient.Startup(freebufferDB, buffersizeDB, addrDB.c_str(), portDB))
  172. {
  173. rTRACE("FAIL: DBRole client - %s", addrDB.c_str());
  174. gOnOneClientClose(oneclient_db);
  175. //return FALSE;
  176. }
  177. const size_t freebufferGateway = gGetPrivateProfileIntEx(sec_gateway, key_freebuffer, file_relaycfg, 0);
  178. const size_t buffersizeGateway = gGetPrivateProfileIntEx(sec_gateway, key_buffersize, file_relaycfg, 0);
  179. std::_tstring addrGateway = gGetPrivateProfileStringEx(sec_gateway, key_address, file_relaycfg);
  180. const unsigned short portGateway = GATEWAY_GAMESVR_SERVICE_PORT;
  181. if (!g_GatewayCenter.Initialize())
  182. return FALSE;
  183. if (!g_GatewayClient.Startup(freebufferGateway, buffersizeGateway, addrGateway.c_str(), portGateway))
  184. {
  185. rTRACE("FAIL: gateway client - %s", addrGateway.c_str());
  186. gOnOneClientClose(oneclient_gateway);
  187. //return FALSE;
  188. }
  189. const size_t playercntHost = gGetPrivateProfileIntEx(sec_host, key_playercnt, file_relaycfg, 0);
  190. const size_t precisionHost = gGetPrivateProfileIntEx(sec_host, key_precision, file_relaycfg, 0);
  191. const size_t freebufferHost = gGetPrivateProfileIntEx(sec_host, key_freebuffer, file_relaycfg, 0);
  192. const size_t buffersizeHost = gGetPrivateProfileIntEx(sec_host, key_buffersize, file_relaycfg, 0);
  193. const DWORD listenaddrHost = INADDR_ANY;
  194. const unsigned short listenportHost = RELAY_GAMESVR_SERVICE_PORT;
  195. if (!g_HostServer.Startup(playercntHost, precisionHost, freebufferHost, buffersizeHost, listenaddrHost, listenportHost))
  196. {
  197. rTRACE("FAIL: host server");
  198. //return FALSE;
  199. }
  200. const size_t playercntTong = gGetPrivateProfileIntEx(sec_tong, key_playercnt, file_relaycfg, 0);
  201. const size_t precisionTong = gGetPrivateProfileIntEx(sec_tong, key_precision, file_relaycfg, 0);
  202. const size_t freebufferTong = gGetPrivateProfileIntEx(sec_tong, key_freebuffer, file_relaycfg, 0);
  203. const size_t buffersizeTong = gGetPrivateProfileIntEx(sec_tong, key_buffersize, file_relaycfg, 0);
  204. const DWORD listenaddrTong = INADDR_ANY;
  205. const unsigned short listenportTong = RELAY_GAMESVR_TONGSERVICE_PORT;
  206. if (!g_TongServer.Startup(playercntTong, precisionTong, freebufferTong, buffersizeTong, listenaddrTong, listenportTong))
  207. {
  208. rTRACE("FAIL: tong server");
  209. //return FALSE;
  210. }
  211. const size_t playercntChat = gGetPrivateProfileIntEx(sec_chat, key_playercnt, file_relaycfg, 0);
  212. const size_t precisionChat = gGetPrivateProfileIntEx(sec_chat, key_precision, file_relaycfg, 0);
  213. const size_t freebufferChat = gGetPrivateProfileIntEx(sec_chat, key_freebuffer, file_relaycfg, 0);
  214. const size_t buffersizeChat = gGetPrivateProfileIntEx(sec_chat, key_buffersize, file_relaycfg, 0);
  215. const DWORD listenaddrChat = INADDR_ANY;
  216. const unsigned short listenportChat = RELAY_GAMESVR_CHATSERVICE_PORT;
  217. if (!g_ChatServer.Startup(playercntChat, precisionChat, freebufferChat, buffersizeChat, listenaddrChat, listenportChat))
  218. {
  219. rTRACE("FAIL: chat server");
  220. //return FALSE;
  221. }
  222. #ifdef _WORKMODE_SINGLETHREAD
  223. if (!g_threadSock.Start())
  224. return FALSE;
  225. #endif
  226. // 帮会数据初始化
  227. if (g_cTongDB.Open())
  228. {
  229. rTRACE("tong database open ok!");
  230. if (g_cTongSet.InitFromDB())
  231. rTRACE("tongset init ok !");
  232. else
  233. rTRACE("FAIL: tongset init error!!!");
  234. }
  235. else
  236. {
  237. rTRACE("FAIL: tong database open error!!!");
  238. }
  239. return TRUE;
  240. }
  241. BOOL gUninitialize()
  242. {
  243. UninitScript();
  244. try
  245. {
  246. //disable reclient timer
  247. gOnOneClientCreate(oneclient_root);
  248. gOnOneClientCreate(oneclient_gateway);
  249. gOnOneClientCreate(oneclient_db);
  250. gs_reclient_enable = FALSE;
  251. #ifdef _WORKMODE_SINGLETHREAD
  252. g_threadSock.Stop();
  253. #endif
  254. g_ChatServer.Shutdown();
  255. g_TongServer.Shutdown();
  256. g_HostServer.Shutdown();
  257. g_GatewayClient.Shutdown();
  258. g_GatewayCenter.Uninitialize();
  259. g_DBClient.Shutdown();
  260. g_DBCenter.Uninitialize();
  261. g_RootClient.Shutdown();
  262. g_RootCenter.Uninitialize();
  263. g_RelayServer.Shutdown();
  264. g_RelayCenter.Uninitialize();
  265. //delay
  266. ::Sleep(2000);
  267. g_ChannelMgr.Uninitialize();
  268. g_FriendMgr.Uninitialize();
  269. g_libRainbow.Uninitialize();
  270. g_libHeaven.Uninitialize();
  271. g_memory.Uninitialize();
  272. g_cTongDB.Close();
  273. }
  274. catch (...)
  275. {
  276. return FALSE;
  277. }
  278. return TRUE;
  279. }
  280. BOOL gIsLocalIP(DWORD ip)
  281. {
  282. return (ip & _localmask) == _localtag;
  283. }
  284. const UCHAR* gGetHostMac(int adapt, size_t* pSize)
  285. {
  286. static struct _MACSTORE
  287. {
  288. enum {MAC_SIZE = 6};
  289. UCHAR macLocal[MAC_SIZE];
  290. UCHAR macGlobal[MAC_SIZE];
  291. _MACSTORE()
  292. {
  293. memset(macLocal, 0, sizeof(macLocal));
  294. memset(macGlobal, 0, sizeof(macGlobal));
  295. gGetMacAndIPAddress(macLocal, NULL, macGlobal, NULL, _localtag, MAC_SIZE);
  296. }
  297. } _macstore;
  298. if (!pSize == NULL)
  299. *pSize = _MACSTORE::MAC_SIZE;
  300. switch (adapt)
  301. {
  302. case local_adapt: return _macstore.macLocal;
  303. case global_adapt: return _macstore.macGlobal;
  304. }
  305. if (!pSize == NULL)
  306. *pSize = 0;
  307. assert(FALSE);
  308. return NULL;
  309. }
  310. DWORD gGetHostIP(int adapt)
  311. {
  312. static struct _IPSTORE
  313. {
  314. DWORD ipLocal;
  315. DWORD ipGlobal;
  316. _IPSTORE() : ipLocal(0), ipGlobal(0)
  317. {
  318. gGetMacAndIPAddress(NULL, &ipLocal, NULL, &ipGlobal, _localtag, 0);
  319. }
  320. } _ipstore;
  321. switch (adapt)
  322. {
  323. case local_adapt: return _ipstore.ipLocal;
  324. case global_adapt: return _ipstore.ipGlobal;
  325. }
  326. assert(FALSE);
  327. return 0;
  328. }
  329. BOOL gConnectToSibling(const char* addr)
  330. {
  331. const size_t freebuffer = gGetPrivateProfileIntEx(sec_relay, key_freebuffer, file_relaycfg, 0);
  332. const size_t buffersize = gGetPrivateProfileIntEx(sec_relay, key_buffersize, file_relaycfg, 0);
  333. CRelayClient* pRelayClient = new CRelayClient(&g_RelayCenter, TRUE);
  334. if (!pRelayClient->Startup(freebuffer, buffersize, addr, RELAY_SIBLING_PORT, FALSE))
  335. return FALSE;
  336. return TRUE;
  337. }
  338. size_t gFillClntwayPckg(DWORD nameid, unsigned long param, 
  339. const RELAY_ASKWAY_DATA* pAskWay, size_t sizeAskWay, RELAY_ASKWAY_DATA* pClntWay, size_t sizeClntWay)
  340. {
  341. assert(sizeAskWay >= sizeof(EXTEND_HEADER));
  342. assert(sizeClntWay >= sizeAskWay + sizeof(DWORD) * 2);
  343. size_t sizeNeed = sizeAskWay + sizeof(DWORD) * 2;
  344. if (sizeClntWay < sizeNeed)
  345. return 0;
  346. *pClntWay = *pAskWay;
  347. pClntWay->seekRelayCount ++;
  348. const void* pMethodData = pAskWay + 1;
  349. void* pMethodDataDup = pClntWay + 1;
  350. memcpy(pMethodDataDup, pMethodData, pAskWay->wMethodDataLength);
  351. DWORD* pp = (DWORD*)((BYTE*)pMethodDataDup + pClntWay->wMethodDataLength);
  352. pp[0] = nameid; pp[1] = param;
  353. pClntWay->wMethodDataLength += sizeof(DWORD) * 2;
  354. const void* pRouteData = (BYTE*)pMethodData + pAskWay->wMethodDataLength;
  355. void* pRouteDataDup = pp + 2;
  356. memcpy(pRouteDataDup, pRouteData, pAskWay->routeDateLength);
  357. return sizeNeed;
  358. }
  359. size_t gFillLosewayPckg(DWORD nToIP, DWORD nToRelayID, 
  360.    const void* pLosePckg, size_t sizeLosePckg, void* pLoseway, size_t sizeLoseway)
  361. {
  362. assert(sizeLosePckg >= sizeof(EXTEND_HEADER));
  363. assert(sizeLoseway >= sizeLosePckg + sizeof(RELAY_DATA));
  364. size_t sizeNeed = sizeLosePckg + sizeof(RELAY_DATA);
  365. if (sizeLoseway < sizeNeed)
  366. return 0;
  367. EXTEND_HEADER* pSrcHdr = (EXTEND_HEADER*)pLosePckg;
  368. RELAY_DATA* pLoseData = (RELAY_DATA*)pLoseway;
  369. pLoseData->ProtocolFamily = pSrcHdr->ProtocolFamily;
  370. pLoseData->ProtocolID = relay_s2c_loseway;
  371. pLoseData->nToIP = nToIP;
  372. pLoseData->nToRelayID = nToRelayID;
  373. pLoseData->nFromIP = 0;
  374. pLoseData->nFromRelayID = -1;
  375. pLoseData->routeDateLength = sizeLosePckg;
  376. void* pRouteData = pLoseData + 1;
  377. memcpy(pRouteData, pLosePckg, sizeLosePckg);
  378. return sizeNeed;
  379. }
  380. BOOL gIsLegalString(LPCTSTR sz, size_t lenlolmt, size_t lenhilmt)
  381. {
  382. if (sz == NULL || lenhilmt < lenlolmt)
  383. return FALSE;
  384. for (size_t pl = 0; pl < lenlolmt; pl++)
  385. if (sz[pl] == 0)
  386. return FALSE;
  387. for (size_t ph = lenlolmt; ph < lenhilmt; ph++)
  388. if (sz[ph] == 0)
  389. return TRUE;
  390. return TRUE;
  391. }
  392. DWORD g_String2Id(LPCSTR pString)
  393. {
  394. DWORD Id = 0;
  395. for (int i = 0; pString[i]; i++)
  396. {
  397. Id = (Id + (i + 1) * pString[i]) % 0x8000000b * 0xffffffef;
  398. }
  399. return Id ^ 0x12345678;
  400. }
  401. BOOL gOnOneClientCreate(ONECLIENT ct)
  402. {
  403. if (!gs_reclient_enable)
  404. return TRUE;
  405. HWND mainwnd = gGetMainWnd();
  406. if (mainwnd == NULL)
  407. return FALSE;
  408. switch (ct)
  409. {
  410. case oneclient_root:
  411. if (gs_timerRoot)
  412. {
  413. if (::KillTimer(mainwnd, gs_timerRoot))
  414. {
  415. gs_timerRoot = 0;
  416. rTRACE("disable reclient: root");
  417. }
  418. }
  419. break;
  420. case oneclient_gateway:
  421. if (gs_timerGateway)
  422. {
  423. if (::KillTimer(mainwnd, gs_timerGateway))
  424. {
  425. gs_timerGateway = 0;
  426. rTRACE("disable reclient: gateway");
  427. }
  428. }
  429. break;
  430. case oneclient_db:
  431. if (gs_timerDB)
  432. {
  433. if (::KillTimer(mainwnd, gs_timerDB))
  434. {
  435. gs_timerDB = 0;
  436. rTRACE("disable reclient: db");
  437. }
  438. }
  439. break;
  440. default:
  441. return FALSE;
  442. }
  443. return TRUE;
  444. }
  445. BOOL gOnOneClientClose(ONECLIENT ct)
  446. {
  447. if (!gs_reclient_enable)
  448. return FALSE;
  449. HWND mainwnd = gGetMainWnd();
  450. if (mainwnd == NULL)
  451. return FALSE;
  452. switch (ct)
  453. {
  454. case oneclient_root:
  455. if (!gs_timerRoot)
  456. {
  457. INT rootinterval = gGetPrivateProfileIntEx(sec_root, key_retryinterval, file_relaycfg, 0);
  458. if (rootinterval > 0)
  459. {
  460. gs_timerRoot = ::SetTimer(mainwnd, timer_rootclient, rootinterval, NULL);
  461. if (!gs_timerRoot)
  462. {
  463. rTRACE("FAIL: enable root reclient");
  464. return FALSE;
  465. }
  466. rTRACE("enable reclient: root");
  467. }
  468. }
  469. break;
  470. case oneclient_gateway:
  471. if (!gs_timerGateway)
  472. {
  473. INT gatewayinterval = gGetPrivateProfileIntEx(sec_gateway, key_retryinterval, file_relaycfg, 0);
  474. if (gatewayinterval > 0)
  475. {
  476. gs_timerGateway = ::SetTimer(mainwnd, timer_gatewayclient, gatewayinterval, NULL);
  477. if (!gs_timerGateway)
  478. {
  479. rTRACE("FAIL: enable gateway reclient");
  480. return FALSE;
  481. }
  482. rTRACE("enable reclient: gateway");
  483. }
  484. }
  485. break;
  486. case oneclient_db:
  487. if (!gs_timerDB)
  488. {
  489. INT dbinterval = gGetPrivateProfileIntEx(sec_dbrole, key_retryinterval, file_relaycfg, 0);
  490. if (dbinterval > 0)
  491. {
  492. gs_timerDB = ::SetTimer(mainwnd, timer_dbclient, dbinterval, NULL);
  493. if (!gs_timerDB)
  494. {
  495. rTRACE("FAIL: enable db reclient");
  496. return FALSE;
  497. }
  498. rTRACE("enable reclient: db");
  499. }
  500. }
  501. break;
  502. default:
  503. return FALSE;
  504. }
  505. return TRUE;
  506. }
  507. BOOL gReOneClient(ONECLIENT ct)
  508. {
  509. if (!gs_reclient_enable)
  510. return FALSE;
  511. switch (ct)
  512. {
  513. case oneclient_root:
  514. {{
  515. if (g_RootClient.IsReady())
  516. return FALSE;
  517. const size_t freebufferRoot = gGetPrivateProfileIntEx(sec_root, key_freebuffer, file_relaycfg, 0);
  518. const size_t buffersizeRoot = gGetPrivateProfileIntEx(sec_root, key_buffersize, file_relaycfg, 0);
  519. std::_tstring addrRoot = gGetPrivateProfileStringEx(sec_root, key_address, file_relaycfg);
  520. const unsigned short portRoot = RELAY_ROUTE_PORT;
  521. rTRACE("try reclient: root - %s", addrRoot.c_str());
  522. if (!g_RootClient.Startup(freebufferRoot, buffersizeRoot, addrRoot.c_str(), portRoot))
  523. {
  524. rTRACE("FAIL: reclient root - %s", addrRoot.c_str());
  525. //return FALSE;
  526. }
  527. }}
  528. break;
  529. case oneclient_gateway:
  530. {{
  531. if (g_GatewayClient.IsReady())
  532. return FALSE;
  533. const size_t freebufferGateway = gGetPrivateProfileIntEx(sec_gateway, key_freebuffer, file_relaycfg, 0);
  534. const size_t buffersizeGateway = gGetPrivateProfileIntEx(sec_gateway, key_buffersize, file_relaycfg, 0);
  535. std::_tstring addrGateway = gGetPrivateProfileStringEx(sec_gateway, key_address, file_relaycfg);
  536. const unsigned short portGateway = GATEWAY_GAMESVR_SERVICE_PORT;
  537. rTRACE("try reclient: gateway - %s", addrGateway.c_str());
  538. if (!g_GatewayClient.Startup(freebufferGateway, buffersizeGateway, addrGateway.c_str(), portGateway))
  539. {
  540. rTRACE("FAIL: reclient gateway - %s", addrGateway.c_str());
  541. //return FALSE;
  542. }
  543. }}
  544. break;
  545. case oneclient_db:
  546. {{
  547. if (g_DBClient.IsReady())
  548. return FALSE;
  549. const size_t freebufferDB = gGetPrivateProfileIntEx(sec_dbrole, key_freebuffer, file_relaycfg, 0);
  550. const size_t buffersizeDB = gGetPrivateProfileIntEx(sec_dbrole, key_buffersize, file_relaycfg, 0);
  551. std::_tstring addrDB = gGetPrivateProfileStringEx(sec_dbrole, key_address, file_relaycfg);
  552. const unsigned short portDB = ROLEDBSVR_ROLEDB_PORT;
  553. rTRACE("try reclient: db - %s", addrDB.c_str());
  554. if (!g_DBClient.Startup(freebufferDB, buffersizeDB, addrDB.c_str(), portDB))
  555. {
  556. rTRACE("FAIL: reclient db - %s", addrDB.c_str());
  557. //return FALSE;
  558. }
  559. }}
  560. break;
  561. }
  562. return TRUE;
  563. }
  564. BOOL gConsignClientSD(IClient* pClient)
  565. {
  566. if (!pClient)
  567. return TRUE;
  568. HWND mainwnd = gGetMainWnd();
  569. if (!mainwnd)
  570. return FALSE;
  571. pClient->AddRef();
  572. ::PostMessage(mainwnd, UM_CONSIGNCLIENTSD, (WPARAM)pClient, 0);
  573. return TRUE;
  574. }
  575. BOOL gStartFriendTimingUpdateDB(UINT elapse)
  576. {
  577. if (gs_timerFriendUdtDB)
  578. return TRUE;
  579. HWND mainwnd = gGetMainWnd();
  580. if (!mainwnd)
  581. return FALSE;
  582. gs_timerFriendUdtDB = ::SetTimer(mainwnd, timer_friendudtdb, elapse, NULL);
  583. if (!gs_timerFriendUdtDB)
  584. {
  585. rTRACE("FAIL: start friend timing update db");
  586. return FALSE;
  587. }
  588. rTRACE("friend timing update db: start");
  589. return TRUE;
  590. }
  591. BOOL gStopFriendTimingUpdateDB()
  592. {
  593. if (!gs_timerFriendUdtDB)
  594. return TRUE;
  595. HWND mainwnd = gGetMainWnd();
  596. if (!mainwnd)
  597. return FALSE;
  598. ::KillTimer(mainwnd, gs_timerFriendUdtDB);
  599. gs_timerFriendUdtDB = 0;
  600. rTRACE("friend timing update db: stop");
  601. return TRUE;
  602. }
  603. BOOL gFriendTimingUpdateDB()
  604. {
  605. if (!g_FriendMgr.BkgrndUpdateDB())
  606. {
  607. rTRACE("warning: update friend DB fail");
  608. return FALSE;
  609. }
  610. rTRACE("update friend DB succeed");
  611. return TRUE;
  612. }