诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2090 lines
68 KiB

  1. #include "StdAfx.h"
  2. #include "ServiceUnits.h"
  3. #include "ControlPacket.h"
  4. #include "AttemperEngineSink.h"
  5. #include "LogonServer.h"
  6. #include "LogonServerDlg.h"
  7. #include "HttpThread.h"
  8. #include <strsafe.h>
  9. #include <unordered_map>
  10. #include "ChineseCode.h"
  11. #include <algorithm>
  12. #include "../../GlobalDef/Util.h"
  13. #include "ZBase64.h"
  14. #include "../../MessageDef/Pb_LogonServer.pb.h"
  15. const WORD wConnectTime = 5;
  16. extern CLogonServerApp theApp;
  17. //////////////////////////////////////////////////////////////////////////////////
  18. //时间标识
  19. #define IDI_LOAD_GAME_LIST 1 //加载列表
  20. #define IDI_CONNECT_CORRESPOND 2 //重连标识
  21. #define IDI_COLLECT_ONLINE_INFO 3 //统计在线
  22. #define IDI_SERVICE 4 //通道检测
  23. #define IDI_JULI 7 //距离清空
  24. ///[---add by yd
  25. #define ID_TIMER_HEARTBEAT 5 //与协调的心跳定时器
  26. ///---]
  27. //////////////////////////////////////////////////////////////////////////////////
  28. //通道检测
  29. #define MDM_GR_CHECK 999 //通道检测
  30. #define DBO_GR_UPTONGDAO 217 //更新通道
  31. #define DBO_GR_UPTONGDAOACK 218 //更新通道处理完成
  32. //客户端发送 我原封不动回复
  33. struct CHECK
  34. {
  35. DWORD connkey;
  36. DWORD dCheckID; //检测编号
  37. DWORD dTime[4]; //时间戳 16字节
  38. };
  39. //构造函数
  40. CAttemperEngineSink::CAttemperEngineSink()
  41. {
  42. //状态变量
  43. m_bNeekCorrespond = true;
  44. m_bShowServerStatus = false;
  45. //状态变量
  46. m_pInitParameter = NULL;
  47. m_pBindParameter = NULL;
  48. //组件变量
  49. m_pITimerEngine = NULL;
  50. m_pIDataBaseEngine = NULL;
  51. m_pITCPNetworkEngine = NULL;
  52. m_pITCPSocketService = NULL;
  53. //视频配置
  54. m_wAVServerPort = 0;
  55. m_dwAVServerAddr = 0;
  56. //缓存变量
  57. m_wTaskCount = 0;
  58. m_wLevelCount = 0;
  59. m_wMemberCount = 0;
  60. m_wTaskCountBuffer = 0;
  61. ZeroMemory(m_lCheckInReward, sizeof(m_lCheckInReward));
  62. ZeroMemory(m_TaskParameter, sizeof(m_TaskParameter));
  63. ZeroMemory(m_MemberParameter, sizeof(m_MemberParameter));
  64. ZeroMemory(m_GrowLevelConfig, sizeof(m_GrowLevelConfig));
  65. ZeroMemory(&m_PlatformParameter, sizeof(m_PlatformParameter));
  66. ZeroMemory(m_TaskParameterBuffer, sizeof(m_TaskParameterBuffer));
  67. ZeroMemory(&m_BaseEnsureParameter, sizeof(m_BaseEnsureParameter));
  68. m_MapServerUserID.InitHashTable(PRIME_PLATFORM_USER);
  69. ///[---add by yd
  70. m_wServerID = 0;
  71. m_dwHearbeatTime = 0;
  72. ///---]
  73. return;
  74. }
  75. //析构函数
  76. CAttemperEngineSink::~CAttemperEngineSink()
  77. {
  78. m_MapServerUserID.RemoveAll();
  79. }
  80. //接口查询
  81. VOID * CAttemperEngineSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
  82. {
  83. QUERYINTERFACE(IAttemperEngineSink, Guid, dwQueryVer);
  84. QUERYINTERFACE_IUNKNOWNEX(IAttemperEngineSink, Guid, dwQueryVer);
  85. return NULL;
  86. }
  87. //启动事件
  88. bool CAttemperEngineSink::OnAttemperEngineStart(IUnknownEx * pIUnknownEx)
  89. {
  90. //绑定参数
  91. m_pBindParameter = new tagBindParameter[m_pInitParameter->m_wMaxConnect];
  92. ZeroMemory(m_pBindParameter, sizeof(tagBindParameter)*m_pInitParameter->m_wMaxConnect);
  93. //设置时间
  94. ASSERT(m_pITimerEngine != NULL);
  95. #ifndef _DEBUG
  96. m_pITimerEngine->SetTimer(IDI_COLLECT_ONLINE_INFO, m_pInitParameter->m_wCollectTime * 1000L, TIMES_INFINITY, 0);
  97. m_pITimerEngine->SetTimer(IDI_SERVICE, 40 * 1000L, TIMES_INFINITY, 0);
  98. #else
  99. m_pITimerEngine->SetTimer(IDI_COLLECT_ONLINE_INFO, 20 * 1000L, TIMES_INFINITY, 0);
  100. m_pITimerEngine->SetTimer(IDI_SERVICE, 40 * 1000L, TIMES_INFINITY, 0);
  101. #endif
  102. m_pITimerEngine->SetTimer(IDI_JULI, 60 * 1000L, TIMES_INFINITY, 0);
  103. //获取目录
  104. TCHAR szPath[MAX_PATH] = TEXT("");
  105. CString szFileName;
  106. GetModuleFileName(AfxGetInstanceHandle(), szPath, sizeof(szPath));
  107. szFileName = szPath;
  108. int nIndex = szFileName.ReverseFind(TEXT('\\'));
  109. szFileName = szFileName.Left(nIndex);
  110. szFileName += TEXT("\\PlazaOptionConfig.ini");
  111. //读取配置
  112. m_bShowServerStatus = (GetPrivateProfileInt(TEXT("ServerStatus"), TEXT("ShowServerStatus"), 0, szFileName) != 0);
  113. //获取目录
  114. TCHAR szServerAddr[LEN_SERVER] = TEXT("");
  115. GetCurrentDirectory(sizeof(szPath), szPath);
  116. //读取配置
  117. TCHAR szVideoFileName[MAX_PATH] = TEXT("");
  118. _sntprintf(szVideoFileName, CountArray(szVideoFileName), TEXT("%s\\VideoOption.ini"), szPath);
  119. m_wAVServerPort = GetPrivateProfileInt(TEXT("VideoOption"), TEXT("ServerPort"), 0, szVideoFileName);
  120. DWORD dwAddrLen = GetPrivateProfileString(TEXT("VideoOption"), TEXT("ServerAddr"), TEXT(""), szServerAddr, LEN_SERVER, szVideoFileName);
  121. if (dwAddrLen > 0)
  122. {
  123. CT2CA strServerDomain(szServerAddr);
  124. m_dwAVServerAddr = inet_addr(strServerDomain);
  125. }
  126. else
  127. {
  128. m_dwAVServerAddr = 0;
  129. }
  130. m_wServerID = CLogonServerDlg::g_StartP.wServerID; // m_pInitParameter->m_wServerID;
  131. TCHAR szServerID[32] = { 0 };
  132. _sntprintf(szServerID, CountArray(szServerID), TEXT("LogonServerID = %d"), m_wServerID);
  133. CTraceService::TraceString(szServerID, TraceLevel_Normal);
  134. return true;
  135. }
  136. //停止事件
  137. bool CAttemperEngineSink::OnAttemperEngineConclude(IUnknownEx * pIUnknownEx)
  138. {
  139. //状态变量
  140. m_bNeekCorrespond = true;
  141. //组件变量
  142. m_pITimerEngine = NULL;
  143. m_pIDataBaseEngine = NULL;
  144. m_pITCPNetworkEngine = NULL;
  145. m_pITCPSocketService = NULL;
  146. //任务参数
  147. m_wTaskCount = 0;
  148. m_wTaskCountBuffer = 0;
  149. ZeroMemory(&m_TaskParameter, sizeof(m_TaskParameter));
  150. ZeroMemory(&m_TaskParameterBuffer, sizeof(m_TaskParameterBuffer));
  151. //会员参数
  152. m_wMemberCount = 0;
  153. ZeroMemory(m_MemberParameter, sizeof(m_MemberParameter));
  154. //等级配置
  155. m_wLevelCount = 0;
  156. ZeroMemory(m_GrowLevelConfig, sizeof(m_GrowLevelConfig));
  157. //签到配置
  158. ZeroMemory(m_lCheckInReward, sizeof(m_lCheckInReward));
  159. //删除数据
  160. SafeDeleteArray(m_pBindParameter);
  161. //列表组件
  162. m_ServerListManager.ResetServerList();
  163. CLogonServerDlg *p = (CLogonServerDlg *)theApp.m_pMainWnd;
  164. if (p)
  165. {
  166. while (true)
  167. {
  168. if (p->ServiceTree.ItemHasChildren(p->hRoot))
  169. {
  170. HTREEITEM hChildItem = p->ServiceTree.GetChildItem(p->hRoot);
  171. p->ServiceTree.DeleteItem(hChildItem);
  172. }
  173. else
  174. {
  175. break;
  176. }
  177. }
  178. m_LoginServiceIDMap.RemoveAll();
  179. }
  180. return true;
  181. }
  182. //控制事件
  183. bool CAttemperEngineSink::OnEventControl(WORD wIdentifier, VOID * pData, WORD wDataSize)
  184. {
  185. switch (wIdentifier)
  186. {
  187. case CT_LOAD_DB_GAME_LIST: //加载列表
  188. {
  189. //加载列表
  190. m_ServerListManager.DisuseKernelItem();
  191. //清理列表
  192. m_ServerListManager.CleanKernelItem();
  193. //事件通知
  194. CP_ControlResult ControlResult;
  195. ControlResult.cbSuccess = ER_SUCCESS;
  196. SendUIControlPacket(UI_LOAD_DB_LIST_RESULT, &ControlResult, sizeof(ControlResult));
  197. //设置时间
  198. ASSERT(m_pITimerEngine != NULL);
  199. m_pITimerEngine->SetTimer(IDI_LOAD_GAME_LIST, m_pInitParameter->m_wLoadListTime * 1000L, 1, 0);
  200. //m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_LOAD_GAME_LIST, 0, NULL, 0);
  201. ////平台参数
  202. //m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_LOAD_PLATFORM_PARAMETER, 0, NULL, 0);
  203. return true;
  204. }
  205. case CT_CONNECT_CORRESPOND: //连接协调
  206. {
  207. //发起连接
  208. tagAddressInfo * pCorrespondAddress = &m_pInitParameter->m_CorrespondAddress;
  209. m_pITCPSocketService->Connect(pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort);
  210. //构造提示
  211. TCHAR szString[512] = TEXT("");
  212. _sntprintf(szString, CountArray(szString), TEXT("正在连接协调服务器 [ %s:%d ]"), pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort);
  213. //提示消息
  214. CTraceService::TraceString(szString, TraceLevel_Normal);
  215. return true;
  216. }
  217. default: break;
  218. }
  219. return false;
  220. }
  221. //调度事件
  222. bool CAttemperEngineSink::OnEventAttemperData(WORD wRequestID, VOID * pData, WORD wDataSize)
  223. {
  224. return false;
  225. }
  226. // 更新通道
  227. int CAttemperEngineSink::UpDataTongDao()
  228. {
  229. //查询所有节点服务器信息
  230. std::unordered_map<std::wstring, int> iptostat;
  231. //枚举数据
  232. POSITION Position = NULL;
  233. //枚举数据
  234. for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  235. {
  236. //获取数据
  237. CGameServerItem * pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  238. if (pGameServerItem == NULL) continue;
  239. bool finda = false;
  240. std::wstring cc = pGameServerItem->m_GameServer.szServerAddr;
  241. auto iter = iptostat.find(cc);
  242. if (iter != std::end(iptostat))
  243. {
  244. //已经存在
  245. finda = true;
  246. }
  247. if (finda) continue;
  248. iptostat[cc] = 1;
  249. }
  250. IPLIST Temp;
  251. ZeroMemory(&Temp, sizeof(IPLIST));
  252. CList<std::wstring> aa;
  253. std::unordered_map<std::wstring, int>::iterator iter_ = iptostat.begin();
  254. for (int i = 0; i < iptostat.size(); i++)
  255. {
  256. if (iter_->first != _T(""))
  257. {
  258. aa.AddTail(iter_->first);
  259. }
  260. iter_++;
  261. }
  262. iptostat.clear();
  263. POSITION Pos = aa.GetHeadPosition();
  264. int i = 0;
  265. while (Pos)
  266. {
  267. std::wstring wRet = aa.GetNext(Pos);
  268. StringCchCat(Temp.ST_LIST[i], 64, wRet.c_str());
  269. i++;
  270. if (i > (64-1)) break;
  271. }
  272. //更新加载通道
  273. m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_ONLINE_SERVICE, 0L, &Temp, sizeof(IPLIST));
  274. return 0;
  275. }
  276. //同步事件
  277. bool CAttemperEngineSink::OnTongBu(int Command, DWORD dwContextID, VOID * pData, WORD wDataSize)
  278. {
  279. switch (Command)
  280. {
  281. case DBO_GR_UPTONGDAO://更新通道
  282. {
  283. UpDataTongDao();
  284. return true;
  285. }
  286. case DBO_GR_UPTONGDAOACK://更新通道处理完成
  287. {
  288. ASSERT(wDataSize == sizeof(LianLuGroup));
  289. if (wDataSize != sizeof(LianLuGroup)) return true;
  290. LianLuGroup *pGroup = (LianLuGroup*)pData;
  291. //枚举数据
  292. POSITION Position = NULL;
  293. //枚举数据
  294. for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  295. {
  296. //获取数据
  297. CGameServerItem * pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  298. if (pGameServerItem == NULL) continue;
  299. std::wstring cc = pGameServerItem->m_GameServer.szServerAddr;
  300. std::wstring dd = pGroup->szAdminIP;
  301. if (cc == dd)
  302. {
  303. for (int j = 0; j < MAX_TONGDAO; j++)
  304. {
  305. std::wstring ip = pGroup->Data[j].szIP;
  306. if (ip == _T("")) continue;
  307. pGameServerItem->SetLLStat(pGroup->Data[j].szIP, pGroup->Data[j].iIsOk, pGroup->Data[j].SystemTimeConclude);
  308. }
  309. }
  310. }
  311. return true;
  312. }
  313. default: break;
  314. }
  315. return true;
  316. }
  317. //时间事件
  318. bool CAttemperEngineSink::OnEventTimer(DWORD dwTimerID, WPARAM wBindParam)
  319. {
  320. switch (dwTimerID)
  321. {
  322. case IDI_LOAD_GAME_LIST: //加载列表
  323. {
  324. //加载列表
  325. m_ServerListManager.DisuseKernelItem();
  326. //清理列表
  327. m_ServerListManager.CleanKernelItem();
  328. //事件通知
  329. CP_ControlResult ControlResult;
  330. ControlResult.cbSuccess = ER_SUCCESS;
  331. SendUIControlPacket(UI_LOAD_DB_LIST_RESULT, &ControlResult, sizeof(ControlResult));
  332. //设置时间
  333. ASSERT(m_pITimerEngine != NULL);
  334. m_pITimerEngine->SetTimer(IDI_LOAD_GAME_LIST, m_pInitParameter->m_wLoadListTime * 1000L, 1, 0);
  335. //m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_LOAD_GAME_LIST, 0, NULL, 0);
  336. return true;
  337. }
  338. case IDI_SERVICE: //加载通道
  339. {
  340. m_pITCPNetworkEngine->OnTBDataEvent(DBO_GR_UPTONGDAO, 0, NULL, 0);
  341. //加载通道
  342. //m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_ONLINE_SERVICE, 0, NULL, 0);
  343. return true;
  344. }
  345. case IDI_JULI: //距离清空
  346. {
  347. m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_CLEARJULI, 0, NULL, 0);
  348. return true;
  349. }
  350. //m_MapUserIDJuli
  351. case IDI_CONNECT_CORRESPOND: //连接协调
  352. {
  353. //发起连接
  354. tagAddressInfo * pCorrespondAddress = &m_pInitParameter->m_CorrespondAddress;
  355. m_pITCPSocketService->Connect(pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort);
  356. //构造提示
  357. TCHAR szString[512] = TEXT("");
  358. _sntprintf(szString, CountArray(szString), TEXT("正在连接协调服务器 [ %s:%d ]"), pCorrespondAddress->szAddress, m_pInitParameter->m_wCorrespondPort);
  359. //提示消息
  360. CTraceService::TraceString(szString, TraceLevel_Normal);
  361. CLogonServerDlg *p = (CLogonServerDlg *)theApp.m_pMainWnd;
  362. ///---清空子节点
  363. if (p)
  364. {
  365. while (true)
  366. {
  367. if (p->ServiceTree.ItemHasChildren(p->hRoot))
  368. {
  369. HTREEITEM hChildItem = p->ServiceTree.GetChildItem(p->hRoot);
  370. p->ServiceTree.DeleteItem(hChildItem);
  371. }
  372. else
  373. {
  374. break;
  375. }
  376. }
  377. m_LoginServiceIDMap.RemoveAll();
  378. }
  379. return true;
  380. }
  381. case IDI_COLLECT_ONLINE_INFO: //统计在线
  382. {
  383. //变量定义
  384. DBR_GP_OnLineCountInfo OnLineCountInfo;
  385. ZeroMemory(&OnLineCountInfo, sizeof(OnLineCountInfo));
  386. //获取总数
  387. OnLineCountInfo.dwOnLineCountSum = m_ServerListManager.CollectOnlineInfo(false);
  388. OnLineCountInfo.dwAndroidCountSum = m_ServerListManager.CollectOnlineInfo(true);
  389. //获取类型
  390. POSITION KindPosition = NULL;
  391. do
  392. {
  393. //获取类型
  394. CGameKindItem * pGameKindItem = m_ServerListManager.EmunGameKindItem(KindPosition);
  395. //设置变量
  396. if (pGameKindItem != NULL)
  397. {
  398. WORD wKindIndex = OnLineCountInfo.wKindCount++;
  399. OnLineCountInfo.OnLineCountKind[wKindIndex].wKindID = pGameKindItem->m_GameKind.wKindID;
  400. //目录人数
  401. OnLineCountInfo.OnLineCountKind[wKindIndex].dwOnLineCount = pGameKindItem->m_GameKind.dwOnLineCount;
  402. OnLineCountInfo.OnLineCountKind[wKindIndex].wTableCount = pGameKindItem->m_GameKind.wTableCount;
  403. OnLineCountInfo.OnLineCountKind[wKindIndex].wFullTableCount = pGameKindItem->m_GameKind.wFullTableCount;
  404. }
  405. //溢出判断
  406. if (OnLineCountInfo.wKindCount >= CountArray(OnLineCountInfo.OnLineCountKind))
  407. {
  408. ASSERT(FALSE);
  409. break;
  410. }
  411. } while (KindPosition != NULL);
  412. //发送请求
  413. WORD wHeadSize = sizeof(OnLineCountInfo) - sizeof(OnLineCountInfo.OnLineCountKind);
  414. WORD wSendSize = wHeadSize + OnLineCountInfo.wKindCount * sizeof(OnLineCountInfo.OnLineCountKind[0]);
  415. m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_ONLINE_COUNT_INFO, 0, &OnLineCountInfo, wSendSize);
  416. return true;
  417. }
  418. ///[---add by yd
  419. case ID_TIMER_HEARTBEAT:
  420. {
  421. if (m_pITCPSocketService != NULL)
  422. {
  423. //变量定义
  424. CMD_CS_C_RegisterPlaza RegisterPlaza;
  425. ZeroMemory(&RegisterPlaza, sizeof(RegisterPlaza));
  426. //设置变量
  427. lstrcpyn(RegisterPlaza.szServerName, m_pInitParameter->m_szServerName, CountArray(RegisterPlaza.szServerName));
  428. lstrcpyn(RegisterPlaza.szServerAddr, m_pInitParameter->m_ServiceAddress.szAddress, CountArray(RegisterPlaza.szServerAddr));
  429. RegisterPlaza.wServerID = m_wServerID;
  430. m_pITCPSocketService->SendData(MDM_CS_MANAGER_SERVICE, SUB_CS_C_LOGON_HEARTBEAT, &RegisterPlaza, sizeof(RegisterPlaza));
  431. }
  432. if (m_dwHearbeatTime > 0) //检测协调服务器有没应答
  433. {
  434. if (GetTickCount() - m_dwHearbeatTime > 6 * TIMES_LOGONSERVER_HEARTBEAT) ///---超时没有收到回包,则断开重连
  435. {
  436. m_pITCPSocketService->CloseSocket();
  437. m_pITimerEngine->KillTimer(ID_TIMER_HEARTBEAT);
  438. m_dwHearbeatTime = 0; //心跳时间
  439. //构造提示
  440. TCHAR szDescribe[128] = TEXT("");
  441. _sntprintf(szDescribe, CountArray(szDescribe), TEXT("没有收到协调服务器心跳回包,%ld 秒后将重新连接"), wConnectTime/*m_pInitParameter->m_wConnectTime*/);
  442. //提示消息
  443. CTraceService::TraceString(szDescribe, TraceLevel_Warning);
  444. //设置时间
  445. ASSERT(m_pITimerEngine != NULL);
  446. m_pITimerEngine->SetTimer(IDI_CONNECT_CORRESPOND, /*m_pInitParameter->m_wConnectTime*/wConnectTime * 1000L, 1, 0);
  447. }
  448. }
  449. return true;
  450. }
  451. default: break;
  452. ///---]
  453. }
  454. return false;
  455. }
  456. //应答事件
  457. bool CAttemperEngineSink::OnEventTCPNetworkBind(DWORD dwClientAddr, DWORD dwSocketID)
  458. {
  459. //获取索引
  460. //ASSERT(LOWORD(dwSocketID) < m_pInitParameter->m_wMaxConnect);
  461. //if (LOWORD(dwSocketID) >= m_pInitParameter->m_wMaxConnect) return false;
  462. //变量定义
  463. WORD wBindIndex = LOWORD(dwSocketID);
  464. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  465. //设置变量
  466. pBindParameter->dwSocketID = dwSocketID;
  467. pBindParameter->dwClientAddr = dwClientAddr;
  468. pBindParameter->dwActiveTime = (DWORD)time(NULL);
  469. //转化地址
  470. TCHAR szClientAddr[16] = TEXT("");
  471. BYTE * pClientAddr = (BYTE *)&dwClientAddr;
  472. _sntprintf(szClientAddr, CountArray(szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]);
  473. CString str;
  474. //str.Format(TEXT("%s 绑定成功, dwSocketID:%d / %d"), szClientAddr, LOWORD(dwSocketID), m_pInitParameter->m_wMaxConnect);
  475. //CTraceService::TraceString(str, TraceLevel_Normal);
  476. return true;
  477. }
  478. //关闭事件
  479. bool CAttemperEngineSink::OnEventTCPNetworkShut(DWORD dwClientAddr, DWORD dwActiveTime, DWORD dwSocketID)
  480. {
  481. //清除信息
  482. WORD wBindIndex = LOWORD(dwSocketID);
  483. ZeroMemory((m_pBindParameter + wBindIndex), sizeof(tagBindParameter));
  484. return false;
  485. }
  486. //读取事件
  487. bool CAttemperEngineSink::OnEventTCPNetworkRead(TCP_Command Command, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  488. {
  489. switch (Command.wMainCmdID)
  490. {
  491. case MDM_MB_YANZM://获取验证码
  492. {
  493. return OnTCPNetworkMainYanZhengM(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  494. }
  495. case MDM_MB_LOGON: //登录命令
  496. {
  497. return OnTCPNetworkMainMBLogon(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  498. }
  499. case MDM_GR_CHECK: //通道检测
  500. {
  501. if (Command.wSubCmdID != 1) return false;
  502. //效验参数
  503. ASSERT(wDataSize == sizeof(CHECK));
  504. if (wDataSize != sizeof(CHECK)) return false;
  505. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_CHECK, 1, pData, wDataSize);
  506. return true;
  507. }
  508. default: break;
  509. }
  510. return false;
  511. }
  512. //数据库事件
  513. bool CAttemperEngineSink::OnEventDataBase(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
  514. {
  515. switch (wRequestID)
  516. {
  517. case DBO_GP_GAME_LIST_RESULT: //加载结果
  518. {
  519. return OnDBPCGameListResult(dwContextID, pData, wDataSize);
  520. }
  521. case DBR_MB_IPHONEYANZM://获取验证码之前,校验数据库成功
  522. {
  523. return OnDBPCYanZhengMSuccess(dwContextID, pData, wDataSize);
  524. }
  525. case DBO_MB_LOGON_SUCCESS: //登录成功
  526. {
  527. return OnDBMBLogonSuccess(dwContextID, pData, wDataSize);
  528. }
  529. case DBO_MB_LOGON_FAILURE: //登录失败
  530. {
  531. return OnDBMBLogonFailure(dwContextID, pData, wDataSize);
  532. }
  533. default: break;
  534. }
  535. return false;
  536. }
  537. //关闭事件
  538. bool CAttemperEngineSink::OnEventTCPSocketShut(WORD wServiceID, BYTE cbShutReason)
  539. {
  540. //协调连接
  541. if (wServiceID == NETWORK_CORRESPOND)
  542. {
  543. //重连判断
  544. if (m_bNeekCorrespond == true)
  545. {
  546. ///[---add by yd 断线后,删除心跳定时器
  547. m_pITimerEngine->KillTimer(ID_TIMER_HEARTBEAT);
  548. ///---]
  549. //构造提示
  550. TCHAR szDescribe[128] = TEXT("");
  551. _sntprintf(szDescribe, CountArray(szDescribe), TEXT("与协调服务器的连接关闭了,%ld 秒后将重新连接"), wConnectTime/*m_pInitParameter->m_wConnectTime*/);
  552. //提示消息
  553. CTraceService::TraceString(szDescribe, TraceLevel_Warning);
  554. //设置时间
  555. ASSERT(m_pITimerEngine != NULL);
  556. m_pITimerEngine->SetTimer(IDI_CONNECT_CORRESPOND, wConnectTime/*m_pInitParameter->m_wConnectTime*/ * 1000L, 1, 0);
  557. return true;
  558. }
  559. }
  560. return false;
  561. }
  562. //连接事件
  563. bool CAttemperEngineSink::OnEventTCPSocketLink(WORD wServiceID, INT nErrorCode)
  564. {
  565. //协调连接
  566. if (wServiceID == NETWORK_CORRESPOND)
  567. {
  568. //错误判断
  569. if (nErrorCode != 0)
  570. {
  571. //构造提示
  572. TCHAR szDescribe[128] = TEXT("");
  573. _sntprintf(szDescribe, CountArray(szDescribe), TEXT("协调服务器连接失败 [ %ld ],%ld 秒后将重新连接"),
  574. nErrorCode, m_pInitParameter->m_wConnectTime);
  575. //提示消息
  576. CTraceService::TraceString(szDescribe, TraceLevel_Warning);
  577. //设置时间
  578. ASSERT(m_pITimerEngine != NULL);
  579. m_pITimerEngine->SetTimer(IDI_CONNECT_CORRESPOND, m_pInitParameter->m_wConnectTime * 1000L, 1, 0);
  580. return false;
  581. }
  582. //提示消息
  583. CTraceService::TraceString(TEXT("正在注册游戏登录服务器..."), TraceLevel_Normal);
  584. //变量定义
  585. CMD_CS_C_RegisterPlaza RegisterPlaza;
  586. ZeroMemory(&RegisterPlaza, sizeof(RegisterPlaza));
  587. //设置变量
  588. lstrcpyn(RegisterPlaza.szServerName, m_pInitParameter->m_szServerName, CountArray(RegisterPlaza.szServerName));
  589. lstrcpyn(RegisterPlaza.szServerAddr, m_pInitParameter->m_ServiceAddress.szAddress, CountArray(RegisterPlaza.szServerAddr));
  590. ///[---add by yd 用当前时间作为登录服务器的ID
  591. RegisterPlaza.wServerID = m_wServerID;
  592. ///---]
  593. //发送数据
  594. m_pITCPSocketService->SendData(MDM_CS_REGISTER, SUB_CS_C_REGISTER_PLAZA, &RegisterPlaza, sizeof(RegisterPlaza));
  595. return true;
  596. }
  597. return true;
  598. }
  599. //读取事件
  600. bool CAttemperEngineSink::OnEventTCPSocketRead(WORD wServiceID, TCP_Command Command, VOID * pData, WORD wDataSize)
  601. {
  602. //协调连接
  603. if (wServiceID == NETWORK_CORRESPOND)
  604. {
  605. switch (Command.wMainCmdID)
  606. {
  607. case MDM_CS_REGISTER: //注册服务
  608. {
  609. return OnTCPSocketMainRegister(Command.wSubCmdID, pData, wDataSize);
  610. }
  611. case MDM_CS_SERVICE_INFO: //服务信息
  612. {
  613. return OnTCPSocketMainServiceInfo(Command.wSubCmdID, pData, wDataSize);
  614. }
  615. case MDM_CS_MANAGER_SERVICE: //管理服务
  616. {
  617. return OnTCPSocketMainManagerService(Command.wSubCmdID, pData, wDataSize);
  618. }
  619. default: break;
  620. }
  621. }
  622. //错误断言
  623. ASSERT(FALSE);
  624. return true;
  625. }
  626. //注册事件
  627. bool CAttemperEngineSink::OnTCPSocketMainRegister(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  628. {
  629. switch (wSubCmdID)
  630. {
  631. case SUB_CS_S_REGISTER_FAILURE: //注册失败
  632. {
  633. ///[---add by yd 注册失败,删除心跳定时器
  634. m_pITimerEngine->KillTimer(ID_TIMER_HEARTBEAT);
  635. ///---]
  636. //变量定义
  637. CMD_CS_S_RegisterFailure * pRegisterFailure = (CMD_CS_S_RegisterFailure *)pData;
  638. //效验参数
  639. ASSERT(wDataSize >= (sizeof(CMD_CS_S_RegisterFailure) - sizeof(pRegisterFailure->szDescribeString)));
  640. if (wDataSize < (sizeof(CMD_CS_S_RegisterFailure) - sizeof(pRegisterFailure->szDescribeString))) return false;
  641. //关闭处理
  642. m_bNeekCorrespond = false;
  643. m_pITCPSocketService->CloseSocket();
  644. //显示消息
  645. LPCTSTR pszDescribeString = pRegisterFailure->szDescribeString;
  646. if (lstrlen(pszDescribeString) > 0) CTraceService::TraceString(pszDescribeString, TraceLevel_Exception);
  647. //事件通知
  648. CP_ControlResult ControlResult;
  649. ControlResult.cbSuccess = ER_FAILURE;
  650. SendUIControlPacket(UI_CORRESPOND_RESULT, &ControlResult, sizeof(ControlResult));
  651. return true;
  652. }
  653. default: break;
  654. }
  655. return true;
  656. }
  657. //列表事件
  658. bool CAttemperEngineSink::OnTCPSocketMainServiceInfo(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  659. {
  660. switch (wSubCmdID)
  661. {
  662. case SUB_CS_S_SERVER_STAT:
  663. {
  664. //游戏节点状态改变
  665. //效验参数
  666. ASSERT(wDataSize == sizeof(JN_GR_SERVICESTAT));
  667. if (wDataSize != sizeof(JN_GR_SERVICESTAT)) return false;
  668. //变量定义
  669. JN_GR_SERVICESTAT * pServerModify = (JN_GR_SERVICESTAT *)pData;
  670. //查找房间
  671. ASSERT(m_ServerListManager.SearchGameServer(pServerModify->dwServerID));
  672. CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerModify->dwServerID);
  673. //设置房间
  674. if (pGameServerItem != NULL)
  675. {
  676. //修改房间信息
  677. pGameServerItem->m_GameServer.bService = pServerModify->bService;
  678. CLogonServerDlg *p = (CLogonServerDlg *)theApp.m_pMainWnd;
  679. if (p)
  680. {
  681. HTREEITEM startitem = p->ServiceTree.GetChildItem(p->hRoot);
  682. while (startitem)
  683. {
  684. CString strTemp = p->ServiceTree.GetItemText(startitem);
  685. DWORD dData = p->ServiceTree.GetItemData(startitem);
  686. if (dData == pServerModify->dwServerID)
  687. {
  688. if (pGameServerItem->m_GameServer.bService > 0)
  689. {
  690. //正常服务状态
  691. p->ServiceTree.SetItemImage(startitem, 1, 1);
  692. break;
  693. }
  694. else if (pGameServerItem->m_GameServer.bService == 0)
  695. {
  696. //主动不提供服务状态
  697. p->ServiceTree.SetItemImage(startitem, 2, 2);
  698. break;
  699. }
  700. else
  701. {
  702. //被攻击无法服务状态
  703. p->ServiceTree.SetItemImage(startitem, 3, 3);
  704. break;
  705. }
  706. }
  707. startitem = p->ServiceTree.GetNextSiblingItem(startitem);
  708. }
  709. }
  710. }
  711. return true;
  712. }
  713. case SUB_CS_S_SERVER_INFO: //房间信息
  714. {
  715. CTraceService::TraceString(TEXT("注册成功"), TraceLevel_Normal);
  716. //废弃列表
  717. m_ServerListManager.DisuseServerItem();
  718. return true;
  719. }
  720. case SUB_CS_S_SERVER_ONLINE: //房间人数
  721. {
  722. //效验参数
  723. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerOnLine));
  724. if (wDataSize != sizeof(CMD_CS_S_ServerOnLine)) return false;
  725. //变量定义
  726. CMD_CS_S_ServerOnLine * pServerOnLine = (CMD_CS_S_ServerOnLine *)pData;
  727. //查找房间
  728. CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerOnLine->wServerID);
  729. if (pGameServerItem == NULL) return true;
  730. //获取对象
  731. tagGameServer * pGameServer = &pGameServerItem->m_GameServer;
  732. DWORD dwOldOnlineCount = pGameServer->dwOnLineCount;
  733. DWORD dwOldwTableCount = pGameServer->wTableOnlineCount;
  734. //房间人数
  735. pGameServer->wTableOnlineCount = pServerOnLine->wTableOnlineCount;
  736. pGameServer->dwOnLineCount = pServerOnLine->dwOnLineCount;
  737. pGameServer->wTableFullCount = pServerOnLine->wTableFullCount;
  738. //目录人数
  739. CGameKindItem * pGameKindItem = m_ServerListManager.SearchGameKind(pGameServer->wKindID);
  740. if (pGameKindItem != NULL)
  741. {
  742. //目录总数
  743. pGameKindItem->m_GameKind.dwOnLineCount -= dwOldOnlineCount;
  744. pGameKindItem->m_GameKind.dwOnLineCount += pGameServer->dwOnLineCount;
  745. //机器人数
  746. pGameKindItem->m_GameKind.wTableCount -= dwOldwTableCount;
  747. pGameKindItem->m_GameKind.wTableCount += pServerOnLine->wTableOnlineCount;
  748. }
  749. CTime time = CTime::GetCurrentTime();
  750. CString m_strTime = time.Format("%Y-%m-%d %H:%M:%S");
  751. DWORD dwOnLineCountSum = m_ServerListManager.CollectOnlineInfo(false);
  752. CString csTest;
  753. csTest.Format(L"%d -> 人数更新 %s,总人数:%d ", pServerOnLine->wServerID, m_strTime, dwOnLineCountSum);
  754. CLogonServerDlg::SetUpdata(csTest);
  755. //回报核查当前登录服务器数据信息
  756. CMD_CS_S_ServerAllOnLine ServerAllOnLineData;
  757. ZeroMemory(&ServerAllOnLineData, sizeof(CMD_CS_S_ServerAllOnLine));
  758. ServerAllOnLineData.dwOnLineCount = dwOnLineCountSum;
  759. ServerAllOnLineData.dwServerNum = m_ServerListManager.GetGameServerCount();
  760. if (m_pITCPSocketService) m_pITCPSocketService->SendData(MDM_CS_SERVICE_INFO, SUB_CS_C_SERVER_ONLINE_ACK, &ServerAllOnLineData, sizeof(CMD_CS_S_ServerAllOnLine));
  761. return true;
  762. }
  763. case SUB_CS_S_SERVER_INSERT: //房间插入
  764. {
  765. //效验参数
  766. ASSERT(wDataSize % sizeof(tagGameServer) == 0);
  767. if (wDataSize % sizeof(tagGameServer) != 0) return false;
  768. //变量定义
  769. WORD wItemCount = wDataSize / sizeof(tagGameServer);
  770. tagGameServer * pGameServer = (tagGameServer *)pData;
  771. //更新数据
  772. for (WORD i = 0; i < wItemCount; i++)
  773. {
  774. m_ServerListManager.InsertGameServer(pGameServer);
  775. CLogonServerDlg *p = (CLogonServerDlg *)theApp.m_pMainWnd;
  776. HTREEITEM hTemp;
  777. if (!m_LoginServiceIDMap.Lookup(pGameServer->wServerID, hTemp))
  778. {
  779. HTREEITEM aa = nullptr;
  780. if (p != NULL)
  781. {
  782. CString csIpPort;
  783. csIpPort.Format(L"%s:%d level->%d stat->%s:%d", pGameServer->szServerAddr, pGameServer->wServerPort, pGameServer->wServerLevel, pGameServer->bService == 1 ? _T("run") : (pGameServer->bService == 0 ? _T("stop") : _T("by ddos")), pGameServer->bService);
  784. aa = p->ServiceTree.InsertItem(csIpPort, 1, 1, p->hRoot, TVI_LAST);
  785. p->ServiceTree.SetItemData(aa, pGameServer->wServerID);
  786. }
  787. m_LoginServiceIDMap[pGameServer->wServerID] = aa;
  788. pGameServer++;
  789. }
  790. }
  791. //更新加载通道
  792. m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_ONLINE_SERVICE, 0, NULL, 0);
  793. return true;
  794. }
  795. case SUB_CS_S_SERVER_MODIFY: //房间修改
  796. {
  797. //效验参数
  798. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerModify));
  799. if (wDataSize != sizeof(CMD_CS_S_ServerModify)) return false;
  800. //变量定义
  801. CMD_CS_S_ServerModify * pServerModify = (CMD_CS_S_ServerModify *)pData;
  802. //查找房间
  803. ASSERT(m_ServerListManager.SearchGameServer(pServerModify->wServerID));
  804. CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerModify->wServerID);
  805. //设置房间
  806. if (pGameServerItem != NULL)
  807. {
  808. //设置人数
  809. DWORD dwOldOnlineCount = pGameServerItem->m_GameServer.dwOnLineCount;
  810. DWORD dwOldFullCount = pGameServerItem->m_GameServer.dwFullCount;
  811. //修改房间信息
  812. pGameServerItem->m_GameServer.wKindID = pServerModify->wKindID;
  813. pGameServerItem->m_GameServer.wNodeID = pServerModify->wNodeID;
  814. pGameServerItem->m_GameServer.wSortID = pServerModify->wSortID;
  815. pGameServerItem->m_GameServer.wServerPort = pServerModify->wServerPort;
  816. pGameServerItem->m_GameServer.dwOnLineCount = pServerModify->dwOnLineCount;
  817. pGameServerItem->m_GameServer.dwFullCount = pServerModify->dwFullCount;
  818. lstrcpyn(pGameServerItem->m_GameServer.szServerName, pServerModify->szServerName, CountArray(pGameServerItem->m_GameServer.szServerName));
  819. lstrcpyn(pGameServerItem->m_GameServer.szServerAddr, pServerModify->szServerAddr, CountArray(pGameServerItem->m_GameServer.szServerAddr));
  820. //目录人数
  821. CGameKindItem * pGameKindItem = m_ServerListManager.SearchGameKind(pGameServerItem->m_GameServer.wKindID);
  822. if (pGameKindItem != NULL)
  823. {
  824. tagGameServer * pGameServer = &pGameServerItem->m_GameServer;
  825. pGameKindItem->m_GameKind.dwOnLineCount -= dwOldOnlineCount;
  826. pGameKindItem->m_GameKind.dwOnLineCount += pGameServer->dwOnLineCount;
  827. pGameKindItem->m_GameKind.dwFullCount -= dwOldFullCount;
  828. pGameKindItem->m_GameKind.dwFullCount += pGameServer->dwFullCount;
  829. }
  830. }
  831. return true;
  832. }
  833. case SUB_CS_S_SERVER_REMOVE: //房间删除
  834. {
  835. //效验参数
  836. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerRemove));
  837. if (wDataSize != sizeof(CMD_CS_S_ServerRemove)) return false;
  838. //变量定义
  839. CMD_CS_S_ServerRemove * pServerRemove = (CMD_CS_S_ServerRemove *)pData;
  840. //变量定义
  841. m_ServerListManager.DeleteGameServer(pServerRemove->wServerID);
  842. CLogonServerDlg *p = (CLogonServerDlg *)theApp.m_pMainWnd;
  843. HTREEITEM hTemp;
  844. if (m_LoginServiceIDMap.Lookup(pServerRemove->wServerID, hTemp))
  845. {
  846. if (p)
  847. {
  848. p->ServiceTree.DeleteItem(hTemp);
  849. }
  850. ///---add by yd 2017-8-4
  851. m_LoginServiceIDMap.RemoveKey(pServerRemove->wServerID);
  852. }
  853. return true;
  854. }
  855. case SUB_CS_S_SERVER_FINISH: //房间完成
  856. {
  857. ///[---add by yd 开启心跳定时器
  858. m_pITimerEngine->SetTimer(ID_TIMER_HEARTBEAT, TIMES_LOGONSERVER_HEARTBEAT, TIMES_INFINITY, 0);
  859. ///---]
  860. //清理列表
  861. m_ServerListManager.CleanServerItem();
  862. //事件处理
  863. CP_ControlResult ControlResult;
  864. ControlResult.cbSuccess = ER_SUCCESS;
  865. SendUIControlPacket(UI_CORRESPOND_RESULT, &ControlResult, sizeof(ControlResult));
  866. return true;
  867. }
  868. case SUB_CS_S_SERVER_USER_INFO: //用户房间信息
  869. {
  870. //效验参数
  871. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerUserInfo));
  872. if (wDataSize != sizeof(CMD_CS_S_ServerUserInfo)) return false;
  873. //变量定义
  874. CMD_CS_S_ServerUserInfo * pServerUserInfo = (CMD_CS_S_ServerUserInfo *)pData;
  875. m_MapServerUserID[pServerUserInfo->dwUserID] = pServerUserInfo->wServerID;
  876. return true;
  877. }
  878. case SUB_CS_C_SERVER_JULI_ACK:
  879. {
  880. ASSERT(wDataSize == sizeof(CMD_CS_C_JULI));
  881. if (wDataSize != sizeof(CMD_CS_C_JULI)) return false;
  882. //投递请求
  883. m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_CLEARJULIADD, 0, pData, wDataSize);
  884. return true;
  885. }
  886. default: break;
  887. }
  888. return true;
  889. }
  890. //管理服务
  891. bool CAttemperEngineSink::OnTCPSocketMainManagerService(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  892. {
  893. switch (wSubCmdID)
  894. {
  895. case SUB_CS_C_LOGON_HEARTBEAT: ///收到协调服务器的心跳回包
  896. {
  897. ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterPlaza));
  898. if (wDataSize != sizeof(CMD_CS_C_RegisterPlaza))
  899. {
  900. return false;
  901. }
  902. CMD_CS_C_RegisterPlaza * pRegisterPlaza = (CMD_CS_C_RegisterPlaza *)pData;
  903. ASSERT(pRegisterPlaza->wServerID == m_wServerID);
  904. m_dwHearbeatTime = GetTickCount(); ///---更新时间
  905. CString str;
  906. str.Format(L"收到协调服务器的心跳回包%ld", m_dwHearbeatTime);
  907. //CTraceService::TraceString(str, TraceLevel_Normal);
  908. }
  909. break;
  910. default: break;
  911. }
  912. return true;
  913. }
  914. bool CAttemperEngineSink::OnTCPNetworkMainMBLogon(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  915. {
  916. switch (wSubCmdID)
  917. {
  918. case SUB_MB_LOGON_ACCOUNTS_IPHONE: //帐号登录,手机号码登录,闲聊登录
  919. {
  920. return OnTCPNetworkSubMBLogonAccounts(pData, wDataSize, dwSocketID);
  921. }
  922. case SUB_MB_LOGON_OTHERPLATFORM: //微信登录
  923. {
  924. return OnTCPNetworkSubMBLogonOtherPlatform(pData, wDataSize, dwSocketID);
  925. }
  926. default: break;
  927. }
  928. TCHAR szString[512] = TEXT("");
  929. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败 [非法协议ID]"));
  930. //提示消息
  931. CTraceService::TraceString(szString, TraceLevel_Normal);
  932. return false;
  933. }
  934. //获取验证码回调
  935. bool CAttemperEngineSink::OnTCPNetworkMainMBLogonMiMa(CString strIPhone, CString VerfCode, DWORD dwSocketID)
  936. {
  937. //投递请求
  938. DBR_MB_VerifCodeToMiMa LogonVerfCodeToMiMa = { 0 };
  939. _sntprintf(LogonVerfCodeToMiMa.PhoneNum, 12, TEXT("%s"), strIPhone);
  940. _sntprintf(LogonVerfCodeToMiMa.VerifCode, 7, TEXT("%s"), VerfCode);
  941. //lstrcpyn(LogonVerfCodeToMiMa.PhoneNum , strIPhone, 12);
  942. //lstrcpyn(LogonVerfCodeToMiMa.VerifCode, VerfCode, 7);
  943. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_IPHONEMIMA, dwSocketID, &LogonVerfCodeToMiMa, sizeof(DBR_MB_VerifCodeToMiMa));
  944. return true;
  945. }
  946. // 回调
  947. bool CAttemperEngineSink::OnTCPNetworkMainHandleMBLogon(CString strIPhone, DWORD dwSocketID)
  948. {
  949. //投递请求
  950. DBR_MB_VerifCodeToMiMa LogonVerfCodeToMiMa = { 0 };
  951. _sntprintf(LogonVerfCodeToMiMa.PhoneNum, 12, TEXT("%s"), strIPhone);
  952. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_HANDLE_IPHONEMIMA, dwSocketID, &LogonVerfCodeToMiMa, sizeof(DBR_MB_VerifCodeToMiMa));
  953. return true;
  954. }
  955. ////I D 登录
  956. //bool CAttemperEngineSink::OnTCPNetworkSubMBLogonGameID(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  957. //{
  958. // CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkSubMBLogonGameID"), TraceLevel_Debug);
  959. // //效验参数
  960. // ASSERT(wDataSize >= sizeof(CMD_MB_LogonGameID));
  961. // if (wDataSize < sizeof(CMD_MB_LogonGameID)) return false;
  962. //
  963. // //变量定义
  964. // WORD wBindIndex = LOWORD(dwSocketID);
  965. // tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  966. //
  967. // //处理消息
  968. // CMD_MB_LogonGameID * pLogonGameID = (CMD_MB_LogonGameID *)pData;
  969. // pLogonGameID->szPassword[CountArray(pLogonGameID->szPassword) - 1] = 0;
  970. // pLogonGameID->szMachineID[CountArray(pLogonGameID->szMachineID) - 1] = 0;
  971. // pLogonGameID->szMobilePhone[CountArray(pLogonGameID->szMobilePhone) - 1] = 0;
  972. //
  973. // //设置连接
  974. // pBindParameter->cbClientKind = CLIENT_KIND_MOBILE;
  975. // pBindParameter->wModuleID = pLogonGameID->wModuleID;
  976. // pBindParameter->dwPlazaVersion = pLogonGameID->dwPlazaVersion;
  977. //
  978. // //效验版本
  979. // if (CheckPlazaVersion(pLogonGameID->cbDeviceType, pLogonGameID->dwPlazaVersion, dwSocketID) == false) return true;
  980. //
  981. // //变量定义
  982. // DBR_MB_LogonGameID LogonGameID;
  983. // ZeroMemory(&LogonGameID, sizeof(LogonGameID));
  984. //
  985. // //附加信息
  986. // LogonGameID.pBindParameter = (m_pBindParameter + LOWORD(dwSocketID));
  987. //
  988. // //构造数据
  989. // LogonGameID.dwGameID = pLogonGameID->dwGameID;
  990. // LogonGameID.dwClientAddr = (m_pBindParameter + LOWORD(dwSocketID))->dwClientAddr;
  991. // lstrcpyn(LogonGameID.szPassword, pLogonGameID->szPassword, CountArray(LogonGameID.szPassword));
  992. // lstrcpyn(LogonGameID.szMachineID, pLogonGameID->szMachineID, CountArray(LogonGameID.szMachineID));
  993. // lstrcpyn(LogonGameID.szMobilePhone, pLogonGameID->szMobilePhone, CountArray(LogonGameID.szMobilePhone));
  994. //
  995. // //投递请求
  996. // m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_LOGON_GAMEID, dwSocketID, &LogonGameID, sizeof(LogonGameID));
  997. //
  998. // return true;
  999. //}
  1000. //获取手机验证码验证码
  1001. bool CAttemperEngineSink::OnTCPNetworkMainYanZhengM(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1002. {
  1003. LogonServer::PB_CS_C_LogonCheckVerifCode VerifCode;
  1004. VerifCode.ParseFromArray(pData, wDataSize);
  1005. DBR_MB_LogonCheckVerifCode pUser;
  1006. ZeroMemory(&pUser, sizeof(pUser));
  1007. CString phonenum = (CA2CTEX<2048>(VerifCode.phonenum().c_str(), CP_UTF8)).m_szBuffer;
  1008. _sntprintf(pUser.PhoneNum, CountArray(pUser.PhoneNum), TEXT("%s"), phonenum);
  1009. pUser.PhoneNum[11] = 0;
  1010. CString str;
  1011. str.Format(TEXT("手机获取验证码 %s,"), pUser.PhoneNum);
  1012. CTraceService::TraceString(str, TraceLevel_Debug);
  1013. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_IPHONEYANZM, dwSocketID, &pUser, sizeof(DBR_MB_LogonCheckVerifCode));
  1014. return true;
  1015. }
  1016. //帐号登录,手机登录
  1017. bool CAttemperEngineSink::OnTCPNetworkSubMBLogonAccounts(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1018. {
  1019. LogonServer::PB_CS_C_LogonAccounts LogonMobile;
  1020. LogonMobile.ParseFromArray(pData, wDataSize);
  1021. //变量定义
  1022. WORD wBindIndex = LOWORD(dwSocketID);
  1023. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1024. //处理消息
  1025. CMD_MB_LogonAccounts pLogonAccounts;
  1026. ZeroMemory(&pLogonAccounts, sizeof(pLogonAccounts));
  1027. pLogonAccounts.wModuleID = LogonMobile.wmoduleid();
  1028. pLogonAccounts.dwPlazaVersion = LogonMobile.dwplazaversion();
  1029. pLogonAccounts.cbDeviceType = LogonMobile.cbdevicetype();
  1030. pLogonAccounts.bLogonType = LogonMobile.blogontype();
  1031. CString szaccounts = (CA2CTEX<2048>(LogonMobile.szaccounts().c_str(), CP_UTF8)).m_szBuffer;
  1032. CString szpassword = (CA2CTEX<2048>(LogonMobile.szpassword().c_str(), CP_UTF8)).m_szBuffer;
  1033. CString szmachineid = (CA2CTEX<2048>(LogonMobile.szmachineid().c_str(), CP_UTF8)).m_szBuffer;
  1034. _sntprintf(pLogonAccounts.szAccounts, CountArray(pLogonAccounts.szAccounts), TEXT("%s"), szaccounts);
  1035. _sntprintf(pLogonAccounts.szPassword, CountArray(pLogonAccounts.szPassword), TEXT("%s"), szpassword);
  1036. _sntprintf(pLogonAccounts.szMachineID, CountArray(pLogonAccounts.szMachineID), TEXT("%s"), szmachineid);
  1037. pLogonAccounts.szAccounts[CountArray(pLogonAccounts.szAccounts) - 1] = 0;
  1038. pLogonAccounts.szPassword[CountArray(pLogonAccounts.szPassword) - 1] = 0;
  1039. pLogonAccounts.szMachineID[CountArray(pLogonAccounts.szMachineID) - 1] = 0;
  1040. //设置连接
  1041. pBindParameter->cbClientKind = CLIENT_KIND_MOBILE;
  1042. pBindParameter->wModuleID = pLogonAccounts.wModuleID;
  1043. pBindParameter->dwPlazaVersion = pLogonAccounts.dwPlazaVersion;
  1044. ////版本判断
  1045. //if (CheckPlazaVersion(pLogonAccounts.cbDeviceType, pLogonAccounts.dwPlazaVersion, dwSocketID) == false) return true;
  1046. //变量定义
  1047. DBR_MB_LogonAccounts LogonAccounts;
  1048. ZeroMemory(&LogonAccounts, sizeof(LogonAccounts));
  1049. //附加信息
  1050. LogonAccounts.cbDeviceType = pLogonAccounts.cbDeviceType;
  1051. LogonAccounts.pBindParameter = (m_pBindParameter + LOWORD(dwSocketID));
  1052. lstrcpyn(LogonAccounts.szAccounts, pLogonAccounts.szAccounts, CountArray(LogonAccounts.szAccounts));
  1053. lstrcpyn(LogonAccounts.szPassword, pLogonAccounts.szPassword, CountArray(LogonAccounts.szPassword));
  1054. lstrcpyn(LogonAccounts.szMachineID, pLogonAccounts.szMachineID, CountArray(LogonAccounts.szMachineID));
  1055. if (pLogonAccounts.bLogonType == 1)//手机号码登录
  1056. {
  1057. lstrcpyn(LogonAccounts.szMobilePhone, pLogonAccounts.szAccounts, CountArray(LogonAccounts.szMobilePhone));
  1058. lstrcpyn(LogonAccounts.szIPhonePassword, pLogonAccounts.szPassword, CountArray(LogonAccounts.szIPhonePassword));
  1059. }
  1060. LogonAccounts.LogonType = pLogonAccounts.bLogonType;
  1061. /*测试数据
  1062. LogonAccounts.LogonType = 1;
  1063. TCHAR str1[12] = _T("18822861951");
  1064. lstrcpyn(LogonAccounts.szMobilePhone, str1, CountArray(str1));
  1065. TCHAR str2[12] = _T("123456");
  1066. lstrcpyn(LogonAccounts.szIPhonePassword, str2, CountArray(str2));
  1067. */
  1068. //投递请求
  1069. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_LOGON_ACCOUNTS, dwSocketID, &LogonAccounts, sizeof(LogonAccounts));
  1070. return true;
  1071. }
  1072. //其他登录
  1073. bool CAttemperEngineSink::OnTCPNetworkSubMBLogonOtherPlatform(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1074. {
  1075. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkSubMBLogonOtherPlatform"), TraceLevel_Debug);
  1076. //变量定义
  1077. WORD wBindIndex = LOWORD(dwSocketID);
  1078. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1079. LogonServer::PB_CS_C_LogonOtherPlatformEx PlatformEx;
  1080. PlatformEx.ParseFromArray(pData, wDataSize);
  1081. //处理消息
  1082. CMD_MB_LogonOtherPlatformEx pLogonOtherPlatform;
  1083. ZeroMemory(&pLogonOtherPlatform, sizeof(pLogonOtherPlatform));
  1084. pLogonOtherPlatform.wModuleID = PlatformEx.wmoduleid();
  1085. pLogonOtherPlatform.dwPlazaVersion = PlatformEx.dwplazaversion();
  1086. pLogonOtherPlatform.cbDeviceType = PlatformEx.cbdevicetype();
  1087. pLogonOtherPlatform.cbGender = PlatformEx.cbgender();
  1088. pLogonOtherPlatform.cbPlatformID = PlatformEx.cbplatformid();
  1089. CString szuseruin = (CA2CTEX<2048>(PlatformEx.szuseruin().c_str(), CP_UTF8)).m_szBuffer;
  1090. CString sznickname = (CA2CTEX<2048>(PlatformEx.sznickname().c_str(), CP_UTF8)).m_szBuffer;
  1091. CString szcompellation = (CA2CTEX<2048>(PlatformEx.szcompellation().c_str(), CP_UTF8)).m_szBuffer;
  1092. CString szmachineid = (CA2CTEX<2048>(PlatformEx.szmachineid().c_str(), CP_UTF8)).m_szBuffer;
  1093. CString szmobilephone = (CA2CTEX<2048>(PlatformEx.szmobilephone().c_str(), CP_UTF8)).m_szBuffer;
  1094. CString szheadurl = (CA2CTEX<2048>(PlatformEx.szheadurl().c_str(), CP_UTF8)).m_szBuffer;
  1095. _sntprintf(pLogonOtherPlatform.szUserUin, CountArray(pLogonOtherPlatform.szUserUin), TEXT("%s"), szuseruin);
  1096. _sntprintf(pLogonOtherPlatform.szNickName, CountArray(pLogonOtherPlatform.szNickName), TEXT("%s"), sznickname);
  1097. _sntprintf(pLogonOtherPlatform.szCompellation, CountArray(pLogonOtherPlatform.szCompellation), TEXT("%s"), szcompellation);
  1098. _sntprintf(pLogonOtherPlatform.szMachineID, CountArray(pLogonOtherPlatform.szMachineID), TEXT("%s"), szmachineid);
  1099. _sntprintf(pLogonOtherPlatform.szMobilePhone, CountArray(pLogonOtherPlatform.szMobilePhone), TEXT("%s"), szmobilephone);
  1100. _sntprintf(pLogonOtherPlatform.szHeadUrl, CountArray(pLogonOtherPlatform.szHeadUrl), TEXT("%s"), szheadurl);
  1101. pLogonOtherPlatform.x = PlatformEx.x();
  1102. pLogonOtherPlatform.y = PlatformEx.y();
  1103. pLogonOtherPlatform.isSimulator = PlatformEx.issimulator();
  1104. pLogonOtherPlatform.networkType = PlatformEx.networktype();
  1105. pLogonOtherPlatform.dianliang = PlatformEx.dianliang();
  1106. pLogonOtherPlatform.szUserUin[CountArray(pLogonOtherPlatform.szUserUin) - 1] = 0;
  1107. //过滤非法字符
  1108. Fstring(pLogonOtherPlatform.szNickName);
  1109. pLogonOtherPlatform.szNickName[CountArray(pLogonOtherPlatform.szNickName) - 1] = 0;
  1110. pLogonOtherPlatform.szMachineID[CountArray(pLogonOtherPlatform.szMachineID) - 1] = 0;//机器标识 版本号
  1111. pLogonOtherPlatform.szMobilePhone[CountArray(pLogonOtherPlatform.szMobilePhone) - 1] = 0;
  1112. pLogonOtherPlatform.szCompellation[CountArray(pLogonOtherPlatform.szCompellation) - 1] = 0;//真实名字 如果等于 AutoLogin 则为自动登录
  1113. pLogonOtherPlatform.szHeadUrl[CountArray(pLogonOtherPlatform.szHeadUrl) - 1] = 0;
  1114. //平台判断
  1115. ASSERT(pLogonOtherPlatform.cbPlatformID == ULMBySina || pLogonOtherPlatform.cbPlatformID == ULMByTencent || pLogonOtherPlatform.cbPlatformID == ULMByRenRen);
  1116. if (pLogonOtherPlatform.cbPlatformID != ULMBySina && pLogonOtherPlatform.cbPlatformID != ULMByTencent && pLogonOtherPlatform.cbPlatformID != ULMByRenRen)
  1117. {
  1118. //构造提示
  1119. TCHAR szString[512] = TEXT("");
  1120. _sntprintf(szString, CountArray(szString), TEXT("客户端[%s]登录失败 [平台编号验证失败]"), pLogonOtherPlatform.szMachineID);
  1121. //提示消息
  1122. CTraceService::TraceString(szString, TraceLevel_Normal);
  1123. return false;
  1124. }
  1125. //设置连接
  1126. pBindParameter->cbClientKind = CLIENT_KIND_MOBILE;
  1127. pBindParameter->wModuleID = pLogonOtherPlatform.wModuleID;
  1128. pBindParameter->dwPlazaVersion = pLogonOtherPlatform.dwPlazaVersion;
  1129. //版本判断
  1130. //if (CheckPlazaVersion(pLogonOtherPlatform.cbDeviceType, pLogonOtherPlatform.dwPlazaVersion, dwSocketID) == false)
  1131. //{
  1132. // //构造提示
  1133. // TCHAR szString[512] = TEXT("");
  1134. // _sntprintf(szString, CountArray(szString), TEXT("客户端[%s]登录失败 [版本验证失败]"), pLogonOtherPlatform.szMachineID);
  1135. // //提示消息
  1136. // CTraceService::TraceString(szString, TraceLevel_Normal);
  1137. // return false;
  1138. //}
  1139. //变量定义
  1140. DBR_MB_LogonOtherPlatform LogonOtherPlatform;
  1141. ZeroMemory(&LogonOtherPlatform, sizeof(LogonOtherPlatform));
  1142. //附加信息
  1143. LogonOtherPlatform.pBindParameter = (m_pBindParameter + LOWORD(dwSocketID));
  1144. //构造数据
  1145. LogonOtherPlatform.dwClientAddr = (m_pBindParameter + LOWORD(dwSocketID))->dwClientAddr;
  1146. LogonOtherPlatform.cbGender = pLogonOtherPlatform.cbGender;
  1147. LogonOtherPlatform.cbPlatformID = pLogonOtherPlatform.cbPlatformID;
  1148. lstrcpyn(LogonOtherPlatform.szUserUin, pLogonOtherPlatform.szUserUin, CountArray(LogonOtherPlatform.szUserUin));
  1149. lstrcpyn(LogonOtherPlatform.szNickName, pLogonOtherPlatform.szNickName, CountArray(LogonOtherPlatform.szNickName));
  1150. lstrcpyn(LogonOtherPlatform.szMachineID, pLogonOtherPlatform.szMachineID, CountArray(LogonOtherPlatform.szMachineID));
  1151. lstrcpyn(LogonOtherPlatform.szMobilePhone, pLogonOtherPlatform.szMobilePhone, CountArray(LogonOtherPlatform.szMobilePhone));
  1152. lstrcpyn(LogonOtherPlatform.szCompellation, pLogonOtherPlatform.szCompellation, CountArray(LogonOtherPlatform.szCompellation));
  1153. lstrcpyn(LogonOtherPlatform.szHeadUrl, pLogonOtherPlatform.szHeadUrl, CountArray(LogonOtherPlatform.szHeadUrl));
  1154. LogonOtherPlatform.x = pLogonOtherPlatform.x;
  1155. LogonOtherPlatform.y = pLogonOtherPlatform.y;
  1156. LogonOtherPlatform.isSimulator = pLogonOtherPlatform.cbDeviceType;
  1157. LogonOtherPlatform.networkType = pLogonOtherPlatform.networkType;
  1158. LogonOtherPlatform.dianliang = pLogonOtherPlatform.dianliang;
  1159. //投递请求
  1160. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_LOGON_OTHERPLATFORM, dwSocketID, &LogonOtherPlatform, sizeof(LogonOtherPlatform));
  1161. return true;
  1162. }
  1163. //手机号码校验
  1164. bool CAttemperEngineSink::OnDBPCYanZhengMSuccess(DWORD dwContextID, VOID * pData, WORD wDataSize)
  1165. {
  1166. if ((m_pBindParameter + LOWORD(dwContextID))->dwSocketID != dwContextID)
  1167. {
  1168. //构造提示
  1169. TCHAR szString[512] = TEXT("");
  1170. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败 [SOCKET核查失败]"));
  1171. //提示消息
  1172. CTraceService::TraceString(szString, TraceLevel_Normal);
  1173. return false;
  1174. }
  1175. //变量定义
  1176. CMD_MB_LogonCheckVerifCode* pCheckVerifCode = (CMD_MB_LogonCheckVerifCode*)pData;
  1177. if (pCheckVerifCode->bResult == 0)
  1178. {
  1179. GETDUILIEBASE_EX VerifCode;
  1180. ZeroMemory(&VerifCode, sizeof(GETDUILIEBASE_EX));
  1181. StringCchCat(VerifCode.szIphoneNum, 12, pCheckVerifCode->PhoneNum);
  1182. VerifCode.CommendID = 1; //校验手机验证码(只作透传)
  1183. VerifCode.dwSocketID = dwContextID;
  1184. CHttpClient::AddLog(dwContextID, VerifCode);
  1185. }
  1186. LogonServer::PB_CS_C_LogonCheckVerifCode pCheckVerif;
  1187. pCheckVerif.set_bresult(pCheckVerifCode->bResult);
  1188. std::string PhoneNum = CW2AEX<1024>(pCheckVerifCode->PhoneNum, CP_UTF8).m_psz;
  1189. pCheckVerif.set_phonenum(PhoneNum);
  1190. /*std::string strErrorDescribe = CW2AEX<1024>(pCheckVerifCode->strErrorDescribe, CP_UTF8).m_psz;
  1191. pCheckVerif.set_strerrordescribe(strErrorDescribe);*/
  1192. //发送数据
  1193. std::string pbdata = pCheckVerif.SerializePartialAsString();
  1194. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_YANZM, 1, (void*)pbdata.c_str(), pbdata.length());
  1195. //关闭连接
  1196. if (pCheckVerifCode->bResult != 0)
  1197. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1198. return true;
  1199. }
  1200. //登录成功
  1201. bool CAttemperEngineSink::OnDBMBLogonSuccess(DWORD dwContextID, VOID * pData, WORD wDataSize)
  1202. {
  1203. //判断在线
  1204. ASSERT(LOWORD(dwContextID) < m_pInitParameter->m_wMaxConnect);
  1205. if ((m_pBindParameter + LOWORD(dwContextID))->dwSocketID != dwContextID)
  1206. {
  1207. //构造提示
  1208. TCHAR szString[512] = TEXT("");
  1209. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败 [SOCKET核查失败]"));
  1210. //提示消息
  1211. CTraceService::TraceString(szString, TraceLevel_Normal);
  1212. return false;
  1213. }
  1214. //变量定义
  1215. DBO_MB_LogonSuccess * pDBOLogonSuccess = (DBO_MB_LogonSuccess *)pData;
  1216. LogonServer::PB_CS_S_LogonSuccess pLogonSuccess;
  1217. pLogonSuccess.set_wfaceid(pDBOLogonSuccess->wFaceID);
  1218. pLogonSuccess.set_cbgender(pDBOLogonSuccess->cbGender);
  1219. pLogonSuccess.set_dwcustomid(pDBOLogonSuccess->dwCustomID);
  1220. pLogonSuccess.set_dwgameid(pDBOLogonSuccess->dwGameID);
  1221. pLogonSuccess.set_dwuserid(pDBOLogonSuccess->dwUserID);
  1222. pLogonSuccess.set_dwexperience(pDBOLogonSuccess->dwExperience);
  1223. pLogonSuccess.set_dwloveliness(pDBOLogonSuccess->dwLoveLiness);
  1224. std::string szNickName = CW2AEX<1024>(pDBOLogonSuccess->szNickName, CP_UTF8).m_psz;
  1225. std::string szDynamicPass = CW2AEX<1024>(pDBOLogonSuccess->szDynamicPass, CP_UTF8).m_psz;
  1226. pLogonSuccess.set_sznickname(szNickName);
  1227. pLogonSuccess.set_szdynamicpass(szDynamicPass);
  1228. pLogonSuccess.set_luserscore(pDBOLogonSuccess->lUserScore);
  1229. pLogonSuccess.set_luseringot(pDBOLogonSuccess->lUserIngot);
  1230. pLogonSuccess.set_luserinsure(pDBOLogonSuccess->lUserInsure);
  1231. pLogonSuccess.set_duserbeans(pDBOLogonSuccess->dUserBeans);
  1232. pLogonSuccess.set_cbinsureenabled(pDBOLogonSuccess->cbInsureEnabled);
  1233. pLogonSuccess.set_bingding(pDBOLogonSuccess->BingDing);
  1234. std::string pbdata = pLogonSuccess.SerializePartialAsString();
  1235. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_SUCCESS, (void*)pbdata.c_str(), pbdata.length());
  1236. //------发送用户服务器ID--------
  1237. //构造结构
  1238. CMD_GP_UserServerID UserServerID;
  1239. ZeroMemory(&UserServerID, sizeof(UserServerID));
  1240. UserServerID.wServerID = 0;
  1241. m_MapServerUserID.Lookup(pDBOLogonSuccess->dwUserID, UserServerID.wServerID);
  1242. if (UserServerID.wServerID != 0 && m_ServerListManager.SearchGameServer(UserServerID.wServerID) == NULL)
  1243. {
  1244. TCHAR szString[512] = TEXT("");
  1245. _sntprintf(szString, CountArray(szString), TEXT("未找到上次游戏节点ID=%d,用户ID=%d"), UserServerID.wServerID, pDBOLogonSuccess->dwUserID);
  1246. //提示消息
  1247. CTraceService::TraceString(szString, TraceLevel_Warning);
  1248. UserServerID.wServerID = 0;
  1249. }
  1250. LogonServer::PB_CS_S_UserServerID ServerID;
  1251. ServerID.set_wserverid(UserServerID.wServerID);
  1252. std::string bdata = ServerID.SerializePartialAsString();
  1253. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GP_USER_SERVICE, SUB_GP_USER_SERVER_ID, (void*)bdata.c_str(), bdata.length());
  1254. //发送房间
  1255. WORD wIndex = LOWORD(dwContextID);
  1256. int iRet = SendMobileServerInfo(dwContextID, (m_pBindParameter + wIndex)->wModuleID, pDBOLogonSuccess->dwXinYong, UserServerID.wServerID, pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->llJuLi);
  1257. if (iRet == -1)
  1258. {
  1259. TCHAR szString[512] = TEXT("");
  1260. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败 [游戏服务器未开启]"));
  1261. //提示消息
  1262. CTraceService::TraceString(szString, TraceLevel_Normal);
  1263. LogonServer::PB_CS_S_LogonFailure pLogonFailures;
  1264. pLogonFailures.set_lresultcode(-1);
  1265. std::string szDescribeString = CW2AEX<1024>(TEXT("出错代码:0x01,当前无可用服务器,请稍后再试."), CP_UTF8).m_psz;
  1266. pLogonFailures.set_szdescribestring(szDescribeString);
  1267. //发送数据
  1268. std::string pbdata = pLogonFailures.SerializePartialAsString();
  1269. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_SUCCESS, (void*)pbdata.c_str(), pbdata.length());
  1270. //关闭连接
  1271. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1272. }
  1273. else if (iRet == 0)
  1274. {
  1275. TCHAR szString[512] = TEXT("");
  1276. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败iRet=0 [无此账号可用游戏服务器] 此账号级别[%d]"), pDBOLogonSuccess->dwXinYong);
  1277. //提示消息
  1278. CTraceService::TraceString(szString, TraceLevel_Normal);
  1279. LogonServer::PB_CS_S_LogonFailure pLogonFailures;
  1280. pLogonFailures.set_lresultcode(-1);
  1281. std::string szDescribeString = CW2AEX<1024>(TEXT("出错代码:0x02,当前无可用服务器,请稍后再试."), CP_UTF8).m_psz;
  1282. pLogonFailures.set_szdescribestring(szDescribeString);
  1283. //发送数据
  1284. std::string pbdata = pLogonFailures.SerializePartialAsString();
  1285. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_SUCCESS, (void*)pbdata.c_str(), pbdata.length());
  1286. //关闭连接
  1287. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1288. }
  1289. else if (iRet == -2)
  1290. {
  1291. TCHAR szString[512] = TEXT("");
  1292. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败iRet=-2 [无此账号可用游戏服务器] 此账号级别[%d]"), pDBOLogonSuccess->dwXinYong);
  1293. //提示消息
  1294. CTraceService::TraceString(szString, TraceLevel_Normal);
  1295. LogonServer::PB_CS_S_LogonFailure pLogonFailures;
  1296. pLogonFailures.set_lresultcode(-1);
  1297. std::string szDescribeString = CW2AEX<1024>(TEXT("出错代码:0x03,当前无可用服务器,请稍后再试."), CP_UTF8).m_psz;
  1298. pLogonFailures.set_szdescribestring(szDescribeString);
  1299. //发送数据
  1300. std::string pbdata = pLogonFailures.SerializePartialAsString();
  1301. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_SUCCESS, (void*)pbdata.c_str(), pbdata.length());
  1302. //关闭连接
  1303. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1304. }
  1305. return true;
  1306. }
  1307. std::string CAttemperEngineSink::string_To_UTF8(LPCSTR str, DWORD dwSize)
  1308. {
  1309. int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
  1310. wchar_t* pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴
  1311. ZeroMemory(pwBuf, nwLen * 2 + 2);
  1312. ::MultiByteToWideChar(CP_ACP, 0, str, dwSize, pwBuf, nwLen);
  1313. int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
  1314. char* pBuf = new char[nLen + 1];
  1315. ZeroMemory(pBuf, nLen + 1);
  1316. ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
  1317. std::string retStr(pBuf);
  1318. delete[]pwBuf;
  1319. delete[]pBuf;
  1320. pwBuf = NULL;
  1321. pBuf = NULL;
  1322. return retStr;
  1323. }
  1324. //登录失败
  1325. bool CAttemperEngineSink::OnDBMBLogonFailure(DWORD dwContextID, VOID * pData, WORD wDataSize)
  1326. {
  1327. //判断在线
  1328. ASSERT(LOWORD(dwContextID) < m_pInitParameter->m_wMaxConnect);
  1329. if ((m_pBindParameter + LOWORD(dwContextID))->dwSocketID != dwContextID) return true;
  1330. //变量定义
  1331. DBO_MB_LogonFailure * pLogonFailure = (DBO_MB_LogonFailure *)pData;
  1332. LogonServer::PB_CS_S_LogonFailure pLogonFailures;
  1333. pLogonFailures.set_lresultcode(pLogonFailure->lResultCode);
  1334. std::string add = CW2AEX<1024>(pLogonFailure->szDescribeString, CP_UTF8).m_psz;
  1335. pLogonFailures.set_szdescribestring(add);
  1336. //发送数据
  1337. std::string pbdata = pLogonFailures.SerializePartialAsString();
  1338. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_FAILURE, (void*)pbdata.c_str(), pbdata.length());
  1339. //关闭连接
  1340. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1341. return true;
  1342. }
  1343. bool CAttemperEngineSink::OnDBPCGameListResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  1344. {
  1345. //效验参数
  1346. ASSERT(wDataSize == sizeof(DBO_GP_GameListResult));
  1347. if (wDataSize != sizeof(DBO_GP_GameListResult)) return false;
  1348. //变量定义
  1349. DBO_GP_GameListResult * pGameListResult = (DBO_GP_GameListResult *)pData;
  1350. //消息处理
  1351. if (pGameListResult->cbSuccess == TRUE)
  1352. {
  1353. //清理列表
  1354. m_ServerListManager.CleanKernelItem();
  1355. //事件通知
  1356. CP_ControlResult ControlResult;
  1357. ControlResult.cbSuccess = ER_SUCCESS;
  1358. SendUIControlPacket(UI_LOAD_DB_LIST_RESULT, &ControlResult, sizeof(ControlResult));
  1359. //设置时间
  1360. ASSERT(m_pITimerEngine != NULL);
  1361. m_pITimerEngine->SetTimer(IDI_LOAD_GAME_LIST, m_pInitParameter->m_wLoadListTime * 1000L, 1, 0);
  1362. }
  1363. else
  1364. {
  1365. //构造提示
  1366. TCHAR szDescribe[128] = TEXT("");
  1367. _sntprintf(szDescribe, CountArray(szDescribe), TEXT("服务器列表加载失败,%ld 秒后将重新加载"), m_pInitParameter->m_wReLoadListTime);
  1368. //提示消息
  1369. CTraceService::TraceString(szDescribe, TraceLevel_Warning);
  1370. //设置时间
  1371. ASSERT(m_pITimerEngine != NULL);
  1372. m_pITimerEngine->SetTimer(IDI_LOAD_GAME_LIST, m_pInitParameter->m_wReLoadListTime * 1000L, 1, 0);
  1373. }
  1374. return true;
  1375. }
  1376. //版本检测
  1377. bool CAttemperEngineSink::CheckPlazaVersion(BYTE cbDeviceType, DWORD dwPlazaVersion, DWORD dwSocketID, bool bCheckLowVer)
  1378. {
  1379. //变量定义
  1380. bool bMustUpdate = false;
  1381. bool bAdviceUpdate = false;
  1382. DWORD dwVersion = VERSION_PLAZA;
  1383. //手机版本
  1384. if (cbDeviceType >= DEVICE_TYPE_IPAD) dwVersion = VERSION_MOBILE_IOS;
  1385. else if (cbDeviceType >= DEVICE_TYPE_IPHONE) dwVersion = VERSION_MOBILE_IOS;
  1386. else if (cbDeviceType >= DEVICE_TYPE_ITOUCH) dwVersion = VERSION_MOBILE_IOS;
  1387. else if (cbDeviceType >= DEVICE_TYPE_ANDROID) dwVersion = VERSION_MOBILE_ANDROID;
  1388. else if (cbDeviceType == DEVICE_TYPE_PC) dwVersion = VERSION_PLAZA;
  1389. //版本判断
  1390. if (bCheckLowVer && GetSubVer(dwPlazaVersion) < GetSubVer(dwVersion)) bAdviceUpdate = true;
  1391. if (GetMainVer(dwPlazaVersion) != GetMainVer(dwVersion)) bMustUpdate = true;
  1392. if (GetProductVer(dwPlazaVersion) != GetProductVer(dwVersion)) bMustUpdate = true;
  1393. //升级判断
  1394. if ((bMustUpdate == true) || (bAdviceUpdate == true))
  1395. {
  1396. ////变量定义
  1397. //CMD_GP_UpdateNotify UpdateNotify;
  1398. //ZeroMemory(&UpdateNotify, sizeof(UpdateNotify));
  1399. ////变量定义
  1400. //UpdateNotify.cbMustUpdate = bMustUpdate;
  1401. //UpdateNotify.cbAdviceUpdate = bAdviceUpdate;
  1402. //UpdateNotify.dwCurrentVersion = dwVersion;
  1403. //发送消息 mod 2019-12-26
  1404. //m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GP_LOGON, SUB_GP_UPDATE_NOTIFY, &UpdateNotify, sizeof(UpdateNotify));
  1405. //中断判断
  1406. if (bMustUpdate == true)
  1407. {
  1408. m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
  1409. return false;
  1410. }
  1411. }
  1412. return true;
  1413. }
  1414. //发送请求
  1415. bool CAttemperEngineSink::SendUIControlPacket(WORD wRequestID, VOID * pData, WORD wDataSize)
  1416. {
  1417. //发送数据
  1418. CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits;
  1419. pServiceUnits->PostControlRequest(wRequestID, pData, wDataSize);
  1420. return true;
  1421. }
  1422. // 函数对象
  1423. class SortByLineCountFunc
  1424. {
  1425. public:
  1426. int operator()(CGameServerItem* l, CGameServerItem* r)
  1427. {
  1428. return l->m_GameServer.dwOnLineCount < r->m_GameServer.dwOnLineCount;
  1429. }
  1430. };
  1431. class SortCountFunc
  1432. {
  1433. public:
  1434. int operator()(LONGLONG l, LONGLONG r)
  1435. {
  1436. return l< r;
  1437. }
  1438. };
  1439. //发送房间
  1440. int CAttemperEngineSink::SendMobileServerInfo(DWORD dwSocketID, WORD wModuleID, DWORD dwXinYong, DWORD wServerID, DWORD dUserID, LONGLONG JuLi)
  1441. {
  1442. //CTraceService::TraceString(L"发送房间", TraceLevel_Warning);
  1443. std::wstring ip;
  1444. //网络数据
  1445. WORD wSendSize = 0;
  1446. BYTE cbDataBuffer[SOCKET_TCP_PACKET];
  1447. ZeroMemory(cbDataBuffer, SOCKET_TCP_PACKET);
  1448. //枚举数据
  1449. POSITION Position = NULL;
  1450. CGameServerItem* pGameServerItem = NULL;
  1451. //计算距离排名
  1452. int iPaiMing = 0; int iCountMax = 1;
  1453. GetPaiMing(dUserID, JuLi, iPaiMing, iCountMax);
  1454. if (wServerID != 0)
  1455. {
  1456. pGameServerItem = m_ServerListManager.SearchGameServer(wServerID);
  1457. if (pGameServerItem)
  1458. {
  1459. ip = pGameServerItem->GetRandom(dUserID, iPaiMing, iCountMax);//获取通道
  1460. if (ip == L"")
  1461. {
  1462. TCHAR szString[512] = TEXT("");
  1463. _sntprintf(szString, CountArray(szString), TEXT("未找到上次游戏节点ID=%d 的可用通道,用户ID=%d"), wServerID,dUserID);
  1464. //提示消息
  1465. CTraceService::TraceString(szString, TraceLevel_Warning);
  1466. goto end1; //获取通道失败,没能力给予断线重连。分配其他服务器IP,重新进入游戏。
  1467. }
  1468. tagGameServer temp;
  1469. ZeroMemory(&temp, sizeof(tagGameServer));
  1470. CopyMemory(&temp, &(pGameServerItem->m_GameServer), sizeof(tagGameServer));
  1471. ZeroMemory(temp.szServerAddr, sizeof(TCHAR) * 32);
  1472. StringCbCat(temp.szServerAddr, 32, ip.c_str());
  1473. LogonServer::PB_CS_S_tagGameServer tagGameServer;
  1474. tagGameServer.set_wkindid(pGameServerItem->m_GameServer.wKindID);
  1475. tagGameServer.set_wnodeid(pGameServerItem->m_GameServer.wNodeID);
  1476. tagGameServer.set_wsortid(pGameServerItem->m_GameServer.wSortID);
  1477. tagGameServer.set_wserverid(pGameServerItem->m_GameServer.wServerID);
  1478. tagGameServer.set_wserverkind(pGameServerItem->m_GameServer.wServerKind);
  1479. tagGameServer.set_wservertype(pGameServerItem->m_GameServer.wServerType);
  1480. tagGameServer.set_wserverport(pGameServerItem->m_GameServer.wServerPort);
  1481. tagGameServer.set_lcellscore(pGameServerItem->m_GameServer.lCellScore);
  1482. tagGameServer.set_lcellscore(pGameServerItem->m_GameServer.lEnterScore);
  1483. tagGameServer.set_dwserverrule(pGameServerItem->m_GameServer.dwServerRule);
  1484. tagGameServer.set_dwonlinecount(pGameServerItem->m_GameServer.dwOnLineCount);
  1485. tagGameServer.set_wtablefullcount(pGameServerItem->m_GameServer.wTableFullCount);
  1486. tagGameServer.set_wtableonlinecount(pGameServerItem->m_GameServer.wTableOnlineCount);
  1487. tagGameServer.set_dwfullcount(pGameServerItem->m_GameServer.dwFullCount);
  1488. std::string szServerAddr = CW2AEX<1024>(temp.szServerAddr, CP_UTF8).m_psz;
  1489. std::string szServerName = CW2AEX<1024>(pGameServerItem->m_GameServer.szServerName, CP_UTF8).m_psz;
  1490. tagGameServer.set_szserveraddr(szServerAddr);
  1491. tagGameServer.set_szservername(szServerName);
  1492. tagGameServer.set_dwlivetime(pGameServerItem->m_GameServer.dwLiveTime);
  1493. tagGameServer.set_wserverlevel(pGameServerItem->m_GameServer.wServerLevel);
  1494. std::string pbdata = tagGameServer.SerializePartialAsString();
  1495. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_MB_SERVER_LIST, SUB_MB_LIST_SERVER, (void*)pbdata.c_str(), pbdata.length());
  1496. TCHAR szString[512] = TEXT("");
  1497. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1498. _sntprintf(szString, CountArray(szString), TEXT("发送可用服务器[%d]-> %s:%d 通道->%s level:%d UserLevel:%d UserID:%d")
  1499. , (pGameServerItem->m_GameServer).wServerID, pGameServerItem->m_GameServer.szServerAddr, pGameServerItem->m_GameServer.wServerPort, ip.c_str(), pGameServerItem->m_GameServer.wServerLevel, dwXinYong, dUserID);
  1500. //提示消息
  1501. CTraceService::TraceString(szString, TraceLevel_Normal);
  1502. return 1;
  1503. }
  1504. }
  1505. end1:
  1506. int iNum = m_ServerListManager.GetGameServerCount();
  1507. if (iNum == 0)
  1508. {
  1509. LogonServer::PB_CS_S_tagGameServer tagGameServer;
  1510. std::string pbdata = tagGameServer.SerializePartialAsString();
  1511. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_MB_SERVER_LIST, SUB_MB_LIST_SERVER, (void*)pbdata.c_str(), pbdata.length());
  1512. return -1;
  1513. }
  1514. CList<CGameServerItem*> List;
  1515. for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  1516. {
  1517. //获取数据
  1518. pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  1519. if (pGameServerItem == NULL) break;
  1520. ///---过滤掉金币场的GameServer
  1521. if (pGameServerItem->m_GameServer.wNodeID > 0)
  1522. {
  1523. CTraceService::TraceString(L"过滤掉一个金币场房间", TraceLevel_Normal);
  1524. continue;
  1525. }
  1526. if (pGameServerItem->m_GameServer.dwOnLineCount >= pGameServerItem->m_GameServer.dwFullCount)
  1527. {
  1528. if (wServerID != pGameServerItem->m_GameServer.wServerID || wServerID == 0)
  1529. {
  1530. TCHAR szString[512] = TEXT("");
  1531. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1532. _sntprintf(szString, CountArray(szString), TEXT("wServerID=%d,pGameServerItem->m_GameServer.wServerID=%d")
  1533. , wServerID, pGameServerItem->m_GameServer.wServerID);
  1534. //提示消息
  1535. CTraceService::TraceString(szString, TraceLevel_Normal);
  1536. continue;
  1537. }
  1538. }
  1539. if (pGameServerItem->m_GameServer.wServerLevel > dwXinYong)
  1540. {
  1541. if (wServerID != pGameServerItem->m_GameServer.wServerID || wServerID == 0)
  1542. {
  1543. TCHAR szString[512] = TEXT("");
  1544. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1545. _sntprintf(szString, CountArray(szString), TEXT("wServerLevel=%d,dwXinYong=%d")
  1546. , pGameServerItem->m_GameServer.wServerLevel, dwXinYong);
  1547. //提示消息
  1548. CTraceService::TraceString(szString, TraceLevel_Normal);
  1549. continue;
  1550. }
  1551. }
  1552. if (pGameServerItem->m_GameServer.bService < 1)
  1553. {
  1554. if (wServerID != pGameServerItem->m_GameServer.wServerID || wServerID == 0)
  1555. {
  1556. if (pGameServerItem->m_GameServer.bService < 0 && pGameServerItem->m_GameServer.wServerLevel == 1 && dwXinYong < 2)
  1557. {
  1558. }
  1559. else
  1560. {
  1561. TCHAR szString[512] = TEXT("");
  1562. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1563. _sntprintf(szString, CountArray(szString), TEXT("bService=%d")
  1564. , pGameServerItem->m_GameServer.bService);
  1565. //提示消息
  1566. CTraceService::TraceString(szString, TraceLevel_Normal);
  1567. continue;
  1568. }
  1569. }
  1570. }
  1571. List.AddTail(pGameServerItem);
  1572. }
  1573. int iCount = List.GetCount();
  1574. if (iCount == 0)
  1575. {
  1576. return -2;
  1577. }
  1578. int iCheckLevel = -1;
  1579. iCheckLevel = dwXinYong < 9 ? dwXinYong : 2;
  1580. CGameServerItem* pRet = NULL;
  1581. for (int i = iCheckLevel; i > 0; i--)
  1582. {
  1583. CGameServerItem* pwip = GetServiceLevel(i, &List, dUserID, iPaiMing, iCountMax);
  1584. if (pwip != NULL)
  1585. {
  1586. pRet = pwip;
  1587. ip = pwip->m_GameServer.szServerAddr;
  1588. if (ip != L"")
  1589. {
  1590. goto end2;
  1591. }
  1592. }
  1593. }
  1594. if (ip == L"")
  1595. {
  1596. TCHAR szString[512] = TEXT("");
  1597. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1598. _sntprintf(szString, CountArray(szString), TEXT("IP为空-> 数量:%d iPaiMing:%d iCountMax:%d ")
  1599. , List.GetCount(), iPaiMing, iCountMax);
  1600. //提示消息
  1601. CTraceService::TraceString(szString, TraceLevel_Normal);
  1602. List.RemoveAll();
  1603. TRACE("\n%s - %d : ip is empty", __FUNCTION__, __LINE__);
  1604. return 0;
  1605. }
  1606. end2:
  1607. List.RemoveAll();
  1608. if (pRet)
  1609. {
  1610. TCHAR szString[512] = TEXT("");
  1611. ZeroMemory(szString, sizeof(TCHAR)*512);
  1612. _sntprintf(szString, CountArray(szString), TEXT("发送可用服务器[%d]-> %s:%d 通道->%s level:%d UserLevel:%d UserID:%d")
  1613. , (pRet->m_GameServer).wServerID, pRet->m_GameServer.szServerAddr, pRet->m_GameServer.wServerPort, ip.c_str(), pRet->m_GameServer.wServerLevel, dwXinYong, dUserID);
  1614. //提示消息
  1615. CTraceService::TraceString(szString, TraceLevel_Normal);
  1616. tagGameServer temp;
  1617. ZeroMemory(&temp, sizeof(tagGameServer));
  1618. CopyMemory(&temp, &(pRet->m_GameServer), sizeof(tagGameServer));
  1619. ZeroMemory(temp.szServerAddr, sizeof(TCHAR)*32);
  1620. StringCbCat(temp.szServerAddr, 32, ip.c_str());
  1621. LogonServer::PB_CS_S_tagGameServer tagGameServer;
  1622. tagGameServer.set_wkindid(temp.wKindID);
  1623. tagGameServer.set_wnodeid(temp.wNodeID);
  1624. tagGameServer.set_wsortid(temp.wSortID);
  1625. tagGameServer.set_wserverid(temp.wServerID);
  1626. tagGameServer.set_wserverkind(temp.wServerKind);
  1627. tagGameServer.set_wservertype(temp.wServerType);
  1628. tagGameServer.set_wserverport(temp.wServerPort);
  1629. tagGameServer.set_lcellscore(temp.lCellScore);
  1630. tagGameServer.set_lcellscore(temp.lEnterScore);
  1631. tagGameServer.set_dwserverrule(temp.dwServerRule);
  1632. tagGameServer.set_dwonlinecount(temp.dwOnLineCount);
  1633. tagGameServer.set_wtablefullcount(temp.wTableFullCount);
  1634. tagGameServer.set_wtableonlinecount(temp.wTableOnlineCount);
  1635. tagGameServer.set_dwfullcount(temp.dwFullCount);
  1636. std::string szServerAddr = CW2AEX<1024>(temp.szServerAddr, CP_UTF8).m_psz;
  1637. std::string szServerName = CW2AEX<1024>(temp.szServerName, CP_UTF8).m_psz;
  1638. tagGameServer.set_szserveraddr(szServerAddr);
  1639. tagGameServer.set_szservername(szServerName);
  1640. tagGameServer.set_dwlivetime(temp.dwLiveTime);
  1641. tagGameServer.set_wserverlevel(temp.wServerLevel);
  1642. std::string pbdata = tagGameServer.SerializePartialAsString();
  1643. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_MB_SERVER_LIST, SUB_MB_LIST_SERVER, (void*)pbdata.c_str(), pbdata.length());
  1644. }
  1645. else
  1646. {
  1647. TCHAR szString[512] = TEXT("");
  1648. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1649. _sntprintf(szString, CountArray(szString), TEXT("IP为空2-> 数量:%d iPaiMing:%d iCountMax:%d ")
  1650. , List.GetCount(), iPaiMing, iCountMax);
  1651. //提示消息
  1652. CTraceService::TraceString(szString, TraceLevel_Normal);
  1653. return 0;
  1654. }
  1655. return 1;
  1656. }
  1657. //获取距离排名
  1658. bool CAttemperEngineSink::GetPaiMing(DWORD dUserID, LONGLONG JuLi, int& iPaiMing, int& iCount)
  1659. {
  1660. iPaiMing = 0;
  1661. iCount = 1;
  1662. //枚举数据
  1663. CDataBaseEngineSink::m_MapUserIDJuli[dUserID] = JuLi;
  1664. std::vector<LONGLONG> vecJuLi;
  1665. DWORD dUser;
  1666. LONGLONG llJuLi;
  1667. POSITION pos = CDataBaseEngineSink::m_MapUserIDJuli.GetStartPosition();
  1668. while (pos)
  1669. {
  1670. CDataBaseEngineSink::m_MapUserIDJuli.GetNextAssoc(pos, dUser, llJuLi);
  1671. vecJuLi.push_back(llJuLi);
  1672. }
  1673. iCount = vecJuLi.size();
  1674. std::sort(vecJuLi.begin(), vecJuLi.end(), SortCountFunc());
  1675. int count = vecJuLi.size();
  1676. for (int i = 0; i < count; i++)
  1677. {
  1678. if (vecJuLi[i] == JuLi)
  1679. {
  1680. iPaiMing = i;
  1681. break;
  1682. }
  1683. }
  1684. vecJuLi.clear();
  1685. return true;
  1686. }
  1687. //////////////////////////////////////////////////////////////////////////////////
  1688. void CAttemperEngineSink::Fstring(TCHAR* pCheck)
  1689. {
  1690. for (int i = 0; i < 32; i++)
  1691. {
  1692. try
  1693. {
  1694. WORD bb = pCheck[i];
  1695. if ((bb > 126 && bb < 19968)
  1696. || (bb > 40869)
  1697. || bb < 33)
  1698. {
  1699. if (pCheck[i] == 0x00) break;
  1700. pCheck[i] = L' ';
  1701. }
  1702. }
  1703. catch (...)
  1704. {
  1705. }
  1706. }
  1707. }
  1708. // 获取可用服务器
  1709. CGameServerItem* CAttemperEngineSink::GetServiceLevel(int iLevel, CList<CGameServerItem*>* List, DWORD UserID, int iPaiMing, int iCount)
  1710. {
  1711. CGameServerItem* pCGameServerItem = NULL;
  1712. std::vector<CGameServerItem*> vecServer;
  1713. POSITION posA = List->GetHeadPosition();
  1714. while (posA)
  1715. {
  1716. CGameServerItem* ptagGameServer = List->GetNext(posA);
  1717. if (ptagGameServer
  1718. &&ptagGameServer->m_GameServer.wServerLevel == iLevel)
  1719. {
  1720. vecServer.push_back(ptagGameServer);
  1721. }
  1722. }
  1723. std::sort(vecServer.begin(), vecServer.end(), SortByLineCountFunc());
  1724. for (BYTE i = 0; i < vecServer.size(); i++)
  1725. {
  1726. CGameServerItem* ptagGameServer = vecServer[i];
  1727. if (ptagGameServer&&ptagGameServer->m_GameServer.dwOnLineCount < ptagGameServer->m_GameServer.dwFullCount)
  1728. {
  1729. if (ptagGameServer->GetRandom(UserID, iPaiMing, iCount) == L"") continue;
  1730. pCGameServerItem = ptagGameServer;
  1731. break;
  1732. }
  1733. }
  1734. return pCGameServerItem;
  1735. }