诸暨麻将添加redis
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

2109 строки
69 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. //测试从reids读取
  728. //hmget
  729. std::vector<std::string> filelds{ "wServerID","dwOnLineCount" };
  730. //hmget
  731. m_RedisClient->GetRedisClient()->hmget(string_format("Server_Info:%d", pServerOnLine->wServerID), filelds, [](cpp_redis::reply& reply) {
  732. for (auto& res : reply.as_array())
  733. {
  734. std::cout << res.as_string() << std::endl;
  735. }
  736. });
  737. //hgetall
  738. m_RedisClient->GetRedisClient()->hgetall(string_format("Server_Info:%d", pServerOnLine->wServerID), [](const cpp_redis::reply& reply) {
  739. for (auto& res : reply.as_array())
  740. {
  741. //std::cout << res << std::endl;
  742. std::cout << res.as_string() << std::endl;
  743. }
  744. });
  745. //查找房间
  746. CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerOnLine->wServerID);
  747. if (pGameServerItem == NULL) return true;
  748. //获取对象
  749. tagGameServer * pGameServer = &pGameServerItem->m_GameServer;
  750. DWORD dwOldOnlineCount = pGameServer->dwOnLineCount;
  751. DWORD dwOldwTableCount = pGameServer->wTableOnlineCount;
  752. //房间人数
  753. pGameServer->wTableOnlineCount = pServerOnLine->wTableOnlineCount;
  754. pGameServer->dwOnLineCount = pServerOnLine->dwOnLineCount;
  755. pGameServer->wTableFullCount = pServerOnLine->wTableFullCount;
  756. //目录人数
  757. CGameKindItem * pGameKindItem = m_ServerListManager.SearchGameKind(pGameServer->wKindID);
  758. if (pGameKindItem != NULL)
  759. {
  760. //目录总数
  761. pGameKindItem->m_GameKind.dwOnLineCount -= dwOldOnlineCount;
  762. pGameKindItem->m_GameKind.dwOnLineCount += pGameServer->dwOnLineCount;
  763. //机器人数
  764. pGameKindItem->m_GameKind.wTableCount -= dwOldwTableCount;
  765. pGameKindItem->m_GameKind.wTableCount += pServerOnLine->wTableOnlineCount;
  766. }
  767. CTime time = CTime::GetCurrentTime();
  768. CString m_strTime = time.Format("%Y-%m-%d %H:%M:%S");
  769. DWORD dwOnLineCountSum = m_ServerListManager.CollectOnlineInfo(false);
  770. CString csTest;
  771. csTest.Format(L"%d -> 人数更新 %s,总人数:%d ", pServerOnLine->wServerID, m_strTime, dwOnLineCountSum);
  772. CLogonServerDlg::SetUpdata(csTest);
  773. //回报核查当前登录服务器数据信息
  774. CMD_CS_S_ServerAllOnLine ServerAllOnLineData;
  775. ZeroMemory(&ServerAllOnLineData, sizeof(CMD_CS_S_ServerAllOnLine));
  776. ServerAllOnLineData.dwOnLineCount = dwOnLineCountSum;
  777. ServerAllOnLineData.dwServerNum = m_ServerListManager.GetGameServerCount();
  778. if (m_pITCPSocketService) m_pITCPSocketService->SendData(MDM_CS_SERVICE_INFO, SUB_CS_C_SERVER_ONLINE_ACK, &ServerAllOnLineData, sizeof(CMD_CS_S_ServerAllOnLine));
  779. return true;
  780. }
  781. case SUB_CS_S_SERVER_INSERT: //房间插入
  782. {
  783. //效验参数
  784. ASSERT(wDataSize % sizeof(tagGameServer) == 0);
  785. if (wDataSize % sizeof(tagGameServer) != 0) return false;
  786. //变量定义
  787. WORD wItemCount = wDataSize / sizeof(tagGameServer);
  788. tagGameServer * pGameServer = (tagGameServer *)pData;
  789. //更新数据
  790. for (WORD i = 0; i < wItemCount; i++)
  791. {
  792. m_ServerListManager.InsertGameServer(pGameServer);
  793. CLogonServerDlg *p = (CLogonServerDlg *)theApp.m_pMainWnd;
  794. HTREEITEM hTemp;
  795. if (!m_LoginServiceIDMap.Lookup(pGameServer->wServerID, hTemp))
  796. {
  797. HTREEITEM aa = nullptr;
  798. if (p != NULL)
  799. {
  800. CString csIpPort;
  801. 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);
  802. aa = p->ServiceTree.InsertItem(csIpPort, 1, 1, p->hRoot, TVI_LAST);
  803. p->ServiceTree.SetItemData(aa, pGameServer->wServerID);
  804. }
  805. m_LoginServiceIDMap[pGameServer->wServerID] = aa;
  806. pGameServer++;
  807. }
  808. }
  809. //更新加载通道
  810. m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_ONLINE_SERVICE, 0, NULL, 0);
  811. return true;
  812. }
  813. case SUB_CS_S_SERVER_MODIFY: //房间修改
  814. {
  815. //效验参数
  816. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerModify));
  817. if (wDataSize != sizeof(CMD_CS_S_ServerModify)) return false;
  818. //变量定义
  819. CMD_CS_S_ServerModify * pServerModify = (CMD_CS_S_ServerModify *)pData;
  820. //查找房间
  821. ASSERT(m_ServerListManager.SearchGameServer(pServerModify->wServerID));
  822. CGameServerItem * pGameServerItem = m_ServerListManager.SearchGameServer(pServerModify->wServerID);
  823. //设置房间
  824. if (pGameServerItem != NULL)
  825. {
  826. //设置人数
  827. DWORD dwOldOnlineCount = pGameServerItem->m_GameServer.dwOnLineCount;
  828. DWORD dwOldFullCount = pGameServerItem->m_GameServer.dwFullCount;
  829. //修改房间信息
  830. pGameServerItem->m_GameServer.wKindID = pServerModify->wKindID;
  831. pGameServerItem->m_GameServer.wNodeID = pServerModify->wNodeID;
  832. pGameServerItem->m_GameServer.wSortID = pServerModify->wSortID;
  833. pGameServerItem->m_GameServer.wServerPort = pServerModify->wServerPort;
  834. pGameServerItem->m_GameServer.dwOnLineCount = pServerModify->dwOnLineCount;
  835. pGameServerItem->m_GameServer.dwFullCount = pServerModify->dwFullCount;
  836. lstrcpyn(pGameServerItem->m_GameServer.szServerName, pServerModify->szServerName, CountArray(pGameServerItem->m_GameServer.szServerName));
  837. lstrcpyn(pGameServerItem->m_GameServer.szServerAddr, pServerModify->szServerAddr, CountArray(pGameServerItem->m_GameServer.szServerAddr));
  838. //目录人数
  839. CGameKindItem * pGameKindItem = m_ServerListManager.SearchGameKind(pGameServerItem->m_GameServer.wKindID);
  840. if (pGameKindItem != NULL)
  841. {
  842. tagGameServer * pGameServer = &pGameServerItem->m_GameServer;
  843. pGameKindItem->m_GameKind.dwOnLineCount -= dwOldOnlineCount;
  844. pGameKindItem->m_GameKind.dwOnLineCount += pGameServer->dwOnLineCount;
  845. pGameKindItem->m_GameKind.dwFullCount -= dwOldFullCount;
  846. pGameKindItem->m_GameKind.dwFullCount += pGameServer->dwFullCount;
  847. }
  848. }
  849. return true;
  850. }
  851. case SUB_CS_S_SERVER_REMOVE: //房间删除
  852. {
  853. //效验参数
  854. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerRemove));
  855. if (wDataSize != sizeof(CMD_CS_S_ServerRemove)) return false;
  856. //变量定义
  857. CMD_CS_S_ServerRemove * pServerRemove = (CMD_CS_S_ServerRemove *)pData;
  858. //变量定义
  859. m_ServerListManager.DeleteGameServer(pServerRemove->wServerID);
  860. CLogonServerDlg *p = (CLogonServerDlg *)theApp.m_pMainWnd;
  861. HTREEITEM hTemp;
  862. if (m_LoginServiceIDMap.Lookup(pServerRemove->wServerID, hTemp))
  863. {
  864. if (p)
  865. {
  866. p->ServiceTree.DeleteItem(hTemp);
  867. }
  868. ///---add by yd 2017-8-4
  869. m_LoginServiceIDMap.RemoveKey(pServerRemove->wServerID);
  870. }
  871. return true;
  872. }
  873. case SUB_CS_S_SERVER_FINISH: //房间完成
  874. {
  875. ///[---add by yd 开启心跳定时器
  876. m_pITimerEngine->SetTimer(ID_TIMER_HEARTBEAT, TIMES_LOGONSERVER_HEARTBEAT, TIMES_INFINITY, 0);
  877. ///---]
  878. //清理列表
  879. m_ServerListManager.CleanServerItem();
  880. //事件处理
  881. CP_ControlResult ControlResult;
  882. ControlResult.cbSuccess = ER_SUCCESS;
  883. SendUIControlPacket(UI_CORRESPOND_RESULT, &ControlResult, sizeof(ControlResult));
  884. return true;
  885. }
  886. case SUB_CS_S_SERVER_USER_INFO: //用户房间信息
  887. {
  888. //效验参数
  889. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerUserInfo));
  890. if (wDataSize != sizeof(CMD_CS_S_ServerUserInfo)) return false;
  891. //变量定义
  892. CMD_CS_S_ServerUserInfo * pServerUserInfo = (CMD_CS_S_ServerUserInfo *)pData;
  893. m_MapServerUserID[pServerUserInfo->dwUserID] = pServerUserInfo->wServerID;
  894. return true;
  895. }
  896. case SUB_CS_C_SERVER_JULI_ACK:
  897. {
  898. ASSERT(wDataSize == sizeof(CMD_CS_C_JULI));
  899. if (wDataSize != sizeof(CMD_CS_C_JULI)) return false;
  900. //投递请求
  901. m_pIDataBaseEngine->PostDataBaseRequest(DBR_GP_CLEARJULIADD, 0, pData, wDataSize);
  902. return true;
  903. }
  904. default: break;
  905. }
  906. return true;
  907. }
  908. //管理服务
  909. bool CAttemperEngineSink::OnTCPSocketMainManagerService(WORD wSubCmdID, VOID * pData, WORD wDataSize)
  910. {
  911. switch (wSubCmdID)
  912. {
  913. case SUB_CS_C_LOGON_HEARTBEAT: ///收到协调服务器的心跳回包
  914. {
  915. ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterPlaza));
  916. if (wDataSize != sizeof(CMD_CS_C_RegisterPlaza))
  917. {
  918. return false;
  919. }
  920. CMD_CS_C_RegisterPlaza * pRegisterPlaza = (CMD_CS_C_RegisterPlaza *)pData;
  921. ASSERT(pRegisterPlaza->wServerID == m_wServerID);
  922. m_dwHearbeatTime = GetTickCount(); ///---更新时间
  923. CString str;
  924. str.Format(L"收到协调服务器的心跳回包%ld", m_dwHearbeatTime);
  925. //CTraceService::TraceString(str, TraceLevel_Normal);
  926. }
  927. break;
  928. default: break;
  929. }
  930. return true;
  931. }
  932. bool CAttemperEngineSink::OnTCPNetworkMainMBLogon(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  933. {
  934. switch (wSubCmdID)
  935. {
  936. case SUB_MB_LOGON_ACCOUNTS_IPHONE: //帐号登录,手机号码登录,闲聊登录
  937. {
  938. return OnTCPNetworkSubMBLogonAccounts(pData, wDataSize, dwSocketID);
  939. }
  940. case SUB_MB_LOGON_OTHERPLATFORM: //微信登录
  941. {
  942. return OnTCPNetworkSubMBLogonOtherPlatform(pData, wDataSize, dwSocketID);
  943. }
  944. default: break;
  945. }
  946. TCHAR szString[512] = TEXT("");
  947. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败 [非法协议ID]"));
  948. //提示消息
  949. CTraceService::TraceString(szString, TraceLevel_Normal);
  950. return false;
  951. }
  952. //获取验证码回调
  953. bool CAttemperEngineSink::OnTCPNetworkMainMBLogonMiMa(CString strIPhone, CString VerfCode, DWORD dwSocketID)
  954. {
  955. //投递请求
  956. DBR_MB_VerifCodeToMiMa LogonVerfCodeToMiMa = { 0 };
  957. _sntprintf(LogonVerfCodeToMiMa.PhoneNum, 12, TEXT("%s"), strIPhone);
  958. _sntprintf(LogonVerfCodeToMiMa.VerifCode, 7, TEXT("%s"), VerfCode);
  959. //lstrcpyn(LogonVerfCodeToMiMa.PhoneNum , strIPhone, 12);
  960. //lstrcpyn(LogonVerfCodeToMiMa.VerifCode, VerfCode, 7);
  961. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_IPHONEMIMA, dwSocketID, &LogonVerfCodeToMiMa, sizeof(DBR_MB_VerifCodeToMiMa));
  962. return true;
  963. }
  964. // 回调
  965. bool CAttemperEngineSink::OnTCPNetworkMainHandleMBLogon(CString strIPhone, DWORD dwSocketID)
  966. {
  967. //投递请求
  968. DBR_MB_VerifCodeToMiMa LogonVerfCodeToMiMa = { 0 };
  969. _sntprintf(LogonVerfCodeToMiMa.PhoneNum, 12, TEXT("%s"), strIPhone);
  970. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_HANDLE_IPHONEMIMA, dwSocketID, &LogonVerfCodeToMiMa, sizeof(DBR_MB_VerifCodeToMiMa));
  971. return true;
  972. }
  973. ////I D 登录
  974. //bool CAttemperEngineSink::OnTCPNetworkSubMBLogonGameID(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  975. //{
  976. // CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkSubMBLogonGameID"), TraceLevel_Debug);
  977. // //效验参数
  978. // ASSERT(wDataSize >= sizeof(CMD_MB_LogonGameID));
  979. // if (wDataSize < sizeof(CMD_MB_LogonGameID)) return false;
  980. //
  981. // //变量定义
  982. // WORD wBindIndex = LOWORD(dwSocketID);
  983. // tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  984. //
  985. // //处理消息
  986. // CMD_MB_LogonGameID * pLogonGameID = (CMD_MB_LogonGameID *)pData;
  987. // pLogonGameID->szPassword[CountArray(pLogonGameID->szPassword) - 1] = 0;
  988. // pLogonGameID->szMachineID[CountArray(pLogonGameID->szMachineID) - 1] = 0;
  989. // pLogonGameID->szMobilePhone[CountArray(pLogonGameID->szMobilePhone) - 1] = 0;
  990. //
  991. // //设置连接
  992. // pBindParameter->cbClientKind = CLIENT_KIND_MOBILE;
  993. // pBindParameter->wModuleID = pLogonGameID->wModuleID;
  994. // pBindParameter->dwPlazaVersion = pLogonGameID->dwPlazaVersion;
  995. //
  996. // //效验版本
  997. // if (CheckPlazaVersion(pLogonGameID->cbDeviceType, pLogonGameID->dwPlazaVersion, dwSocketID) == false) return true;
  998. //
  999. // //变量定义
  1000. // DBR_MB_LogonGameID LogonGameID;
  1001. // ZeroMemory(&LogonGameID, sizeof(LogonGameID));
  1002. //
  1003. // //附加信息
  1004. // LogonGameID.pBindParameter = (m_pBindParameter + LOWORD(dwSocketID));
  1005. //
  1006. // //构造数据
  1007. // LogonGameID.dwGameID = pLogonGameID->dwGameID;
  1008. // LogonGameID.dwClientAddr = (m_pBindParameter + LOWORD(dwSocketID))->dwClientAddr;
  1009. // lstrcpyn(LogonGameID.szPassword, pLogonGameID->szPassword, CountArray(LogonGameID.szPassword));
  1010. // lstrcpyn(LogonGameID.szMachineID, pLogonGameID->szMachineID, CountArray(LogonGameID.szMachineID));
  1011. // lstrcpyn(LogonGameID.szMobilePhone, pLogonGameID->szMobilePhone, CountArray(LogonGameID.szMobilePhone));
  1012. //
  1013. // //投递请求
  1014. // m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_LOGON_GAMEID, dwSocketID, &LogonGameID, sizeof(LogonGameID));
  1015. //
  1016. // return true;
  1017. //}
  1018. //获取手机验证码验证码
  1019. bool CAttemperEngineSink::OnTCPNetworkMainYanZhengM(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1020. {
  1021. LogonServer::PB_CS_C_LogonCheckVerifCode VerifCode;
  1022. VerifCode.ParseFromArray(pData, wDataSize);
  1023. DBR_MB_LogonCheckVerifCode pUser;
  1024. ZeroMemory(&pUser, sizeof(pUser));
  1025. CString phonenum = (CA2CTEX<2048>(VerifCode.phonenum().c_str(), CP_UTF8)).m_szBuffer;
  1026. _sntprintf(pUser.PhoneNum, CountArray(pUser.PhoneNum), TEXT("%s"), phonenum);
  1027. pUser.PhoneNum[11] = 0;
  1028. CString str;
  1029. str.Format(TEXT("手机获取验证码 %s,"), pUser.PhoneNum);
  1030. CTraceService::TraceString(str, TraceLevel_Debug);
  1031. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_IPHONEYANZM, dwSocketID, &pUser, sizeof(DBR_MB_LogonCheckVerifCode));
  1032. return true;
  1033. }
  1034. //帐号登录,手机登录
  1035. bool CAttemperEngineSink::OnTCPNetworkSubMBLogonAccounts(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1036. {
  1037. LogonServer::PB_CS_C_LogonAccounts LogonMobile;
  1038. LogonMobile.ParseFromArray(pData, wDataSize);
  1039. //变量定义
  1040. WORD wBindIndex = LOWORD(dwSocketID);
  1041. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1042. //处理消息
  1043. CMD_MB_LogonAccounts pLogonAccounts;
  1044. ZeroMemory(&pLogonAccounts, sizeof(pLogonAccounts));
  1045. pLogonAccounts.wModuleID = LogonMobile.wmoduleid();
  1046. pLogonAccounts.dwPlazaVersion = LogonMobile.dwplazaversion();
  1047. pLogonAccounts.cbDeviceType = LogonMobile.cbdevicetype();
  1048. pLogonAccounts.bLogonType = LogonMobile.blogontype();
  1049. CString szaccounts = (CA2CTEX<2048>(LogonMobile.szaccounts().c_str(), CP_UTF8)).m_szBuffer;
  1050. CString szpassword = (CA2CTEX<2048>(LogonMobile.szpassword().c_str(), CP_UTF8)).m_szBuffer;
  1051. CString szmachineid = (CA2CTEX<2048>(LogonMobile.szmachineid().c_str(), CP_UTF8)).m_szBuffer;
  1052. _sntprintf(pLogonAccounts.szAccounts, CountArray(pLogonAccounts.szAccounts), TEXT("%s"), szaccounts);
  1053. _sntprintf(pLogonAccounts.szPassword, CountArray(pLogonAccounts.szPassword), TEXT("%s"), szpassword);
  1054. _sntprintf(pLogonAccounts.szMachineID, CountArray(pLogonAccounts.szMachineID), TEXT("%s"), szmachineid);
  1055. pLogonAccounts.szAccounts[CountArray(pLogonAccounts.szAccounts) - 1] = 0;
  1056. pLogonAccounts.szPassword[CountArray(pLogonAccounts.szPassword) - 1] = 0;
  1057. pLogonAccounts.szMachineID[CountArray(pLogonAccounts.szMachineID) - 1] = 0;
  1058. //设置连接
  1059. pBindParameter->cbClientKind = CLIENT_KIND_MOBILE;
  1060. pBindParameter->wModuleID = pLogonAccounts.wModuleID;
  1061. pBindParameter->dwPlazaVersion = pLogonAccounts.dwPlazaVersion;
  1062. ////版本判断
  1063. //if (CheckPlazaVersion(pLogonAccounts.cbDeviceType, pLogonAccounts.dwPlazaVersion, dwSocketID) == false) return true;
  1064. //变量定义
  1065. DBR_MB_LogonAccounts LogonAccounts;
  1066. ZeroMemory(&LogonAccounts, sizeof(LogonAccounts));
  1067. //附加信息
  1068. LogonAccounts.cbDeviceType = pLogonAccounts.cbDeviceType;
  1069. LogonAccounts.pBindParameter = (m_pBindParameter + LOWORD(dwSocketID));
  1070. lstrcpyn(LogonAccounts.szAccounts, pLogonAccounts.szAccounts, CountArray(LogonAccounts.szAccounts));
  1071. lstrcpyn(LogonAccounts.szPassword, pLogonAccounts.szPassword, CountArray(LogonAccounts.szPassword));
  1072. lstrcpyn(LogonAccounts.szMachineID, pLogonAccounts.szMachineID, CountArray(LogonAccounts.szMachineID));
  1073. if (pLogonAccounts.bLogonType == 1)//手机号码登录
  1074. {
  1075. lstrcpyn(LogonAccounts.szMobilePhone, pLogonAccounts.szAccounts, CountArray(LogonAccounts.szMobilePhone));
  1076. lstrcpyn(LogonAccounts.szIPhonePassword, pLogonAccounts.szPassword, CountArray(LogonAccounts.szIPhonePassword));
  1077. }
  1078. LogonAccounts.LogonType = pLogonAccounts.bLogonType;
  1079. /*测试数据
  1080. LogonAccounts.LogonType = 1;
  1081. TCHAR str1[12] = _T("18822861951");
  1082. lstrcpyn(LogonAccounts.szMobilePhone, str1, CountArray(str1));
  1083. TCHAR str2[12] = _T("123456");
  1084. lstrcpyn(LogonAccounts.szIPhonePassword, str2, CountArray(str2));
  1085. */
  1086. //投递请求
  1087. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_LOGON_ACCOUNTS, dwSocketID, &LogonAccounts, sizeof(LogonAccounts));
  1088. return true;
  1089. }
  1090. //其他登录
  1091. bool CAttemperEngineSink::OnTCPNetworkSubMBLogonOtherPlatform(VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1092. {
  1093. CTraceService::TraceString(TEXT("CAttemperEngineSink::OnTCPNetworkSubMBLogonOtherPlatform"), TraceLevel_Debug);
  1094. //变量定义
  1095. WORD wBindIndex = LOWORD(dwSocketID);
  1096. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1097. LogonServer::PB_CS_C_LogonOtherPlatformEx PlatformEx;
  1098. PlatformEx.ParseFromArray(pData, wDataSize);
  1099. //处理消息
  1100. CMD_MB_LogonOtherPlatformEx pLogonOtherPlatform;
  1101. ZeroMemory(&pLogonOtherPlatform, sizeof(pLogonOtherPlatform));
  1102. pLogonOtherPlatform.wModuleID = PlatformEx.wmoduleid();
  1103. pLogonOtherPlatform.dwPlazaVersion = PlatformEx.dwplazaversion();
  1104. pLogonOtherPlatform.cbDeviceType = PlatformEx.cbdevicetype();
  1105. pLogonOtherPlatform.cbGender = PlatformEx.cbgender();
  1106. pLogonOtherPlatform.cbPlatformID = PlatformEx.cbplatformid();
  1107. CString szuseruin = (CA2CTEX<2048>(PlatformEx.szuseruin().c_str(), CP_UTF8)).m_szBuffer;
  1108. CString sznickname = (CA2CTEX<2048>(PlatformEx.sznickname().c_str(), CP_UTF8)).m_szBuffer;
  1109. CString szcompellation = (CA2CTEX<2048>(PlatformEx.szcompellation().c_str(), CP_UTF8)).m_szBuffer;
  1110. CString szmachineid = (CA2CTEX<2048>(PlatformEx.szmachineid().c_str(), CP_UTF8)).m_szBuffer;
  1111. CString szmobilephone = (CA2CTEX<2048>(PlatformEx.szmobilephone().c_str(), CP_UTF8)).m_szBuffer;
  1112. CString szheadurl = (CA2CTEX<2048>(PlatformEx.szheadurl().c_str(), CP_UTF8)).m_szBuffer;
  1113. _sntprintf(pLogonOtherPlatform.szUserUin, CountArray(pLogonOtherPlatform.szUserUin), TEXT("%s"), szuseruin);
  1114. _sntprintf(pLogonOtherPlatform.szNickName, CountArray(pLogonOtherPlatform.szNickName), TEXT("%s"), sznickname);
  1115. _sntprintf(pLogonOtherPlatform.szCompellation, CountArray(pLogonOtherPlatform.szCompellation), TEXT("%s"), szcompellation);
  1116. _sntprintf(pLogonOtherPlatform.szMachineID, CountArray(pLogonOtherPlatform.szMachineID), TEXT("%s"), szmachineid);
  1117. _sntprintf(pLogonOtherPlatform.szMobilePhone, CountArray(pLogonOtherPlatform.szMobilePhone), TEXT("%s"), szmobilephone);
  1118. _sntprintf(pLogonOtherPlatform.szHeadUrl, CountArray(pLogonOtherPlatform.szHeadUrl), TEXT("%s"), szheadurl);
  1119. pLogonOtherPlatform.x = PlatformEx.x();
  1120. pLogonOtherPlatform.y = PlatformEx.y();
  1121. pLogonOtherPlatform.isSimulator = PlatformEx.issimulator();
  1122. pLogonOtherPlatform.networkType = PlatformEx.networktype();
  1123. pLogonOtherPlatform.dianliang = PlatformEx.dianliang();
  1124. pLogonOtherPlatform.szUserUin[CountArray(pLogonOtherPlatform.szUserUin) - 1] = 0;
  1125. //过滤非法字符
  1126. Fstring(pLogonOtherPlatform.szNickName);
  1127. pLogonOtherPlatform.szNickName[CountArray(pLogonOtherPlatform.szNickName) - 1] = 0;
  1128. pLogonOtherPlatform.szMachineID[CountArray(pLogonOtherPlatform.szMachineID) - 1] = 0;//机器标识 版本号
  1129. pLogonOtherPlatform.szMobilePhone[CountArray(pLogonOtherPlatform.szMobilePhone) - 1] = 0;
  1130. pLogonOtherPlatform.szCompellation[CountArray(pLogonOtherPlatform.szCompellation) - 1] = 0;//真实名字 如果等于 AutoLogin 则为自动登录
  1131. pLogonOtherPlatform.szHeadUrl[CountArray(pLogonOtherPlatform.szHeadUrl) - 1] = 0;
  1132. //平台判断
  1133. ASSERT(pLogonOtherPlatform.cbPlatformID == ULMBySina || pLogonOtherPlatform.cbPlatformID == ULMByTencent || pLogonOtherPlatform.cbPlatformID == ULMByRenRen);
  1134. if (pLogonOtherPlatform.cbPlatformID != ULMBySina && pLogonOtherPlatform.cbPlatformID != ULMByTencent && pLogonOtherPlatform.cbPlatformID != ULMByRenRen)
  1135. {
  1136. //构造提示
  1137. TCHAR szString[512] = TEXT("");
  1138. _sntprintf(szString, CountArray(szString), TEXT("客户端[%s]登录失败 [平台编号验证失败]"), pLogonOtherPlatform.szMachineID);
  1139. //提示消息
  1140. CTraceService::TraceString(szString, TraceLevel_Normal);
  1141. return false;
  1142. }
  1143. //设置连接
  1144. pBindParameter->cbClientKind = CLIENT_KIND_MOBILE;
  1145. pBindParameter->wModuleID = pLogonOtherPlatform.wModuleID;
  1146. pBindParameter->dwPlazaVersion = pLogonOtherPlatform.dwPlazaVersion;
  1147. //版本判断
  1148. //if (CheckPlazaVersion(pLogonOtherPlatform.cbDeviceType, pLogonOtherPlatform.dwPlazaVersion, dwSocketID) == false)
  1149. //{
  1150. // //构造提示
  1151. // TCHAR szString[512] = TEXT("");
  1152. // _sntprintf(szString, CountArray(szString), TEXT("客户端[%s]登录失败 [版本验证失败]"), pLogonOtherPlatform.szMachineID);
  1153. // //提示消息
  1154. // CTraceService::TraceString(szString, TraceLevel_Normal);
  1155. // return false;
  1156. //}
  1157. //变量定义
  1158. DBR_MB_LogonOtherPlatform LogonOtherPlatform;
  1159. ZeroMemory(&LogonOtherPlatform, sizeof(LogonOtherPlatform));
  1160. //附加信息
  1161. LogonOtherPlatform.pBindParameter = (m_pBindParameter + LOWORD(dwSocketID));
  1162. //构造数据
  1163. LogonOtherPlatform.dwClientAddr = (m_pBindParameter + LOWORD(dwSocketID))->dwClientAddr;
  1164. LogonOtherPlatform.cbGender = pLogonOtherPlatform.cbGender;
  1165. LogonOtherPlatform.cbPlatformID = pLogonOtherPlatform.cbPlatformID;
  1166. lstrcpyn(LogonOtherPlatform.szUserUin, pLogonOtherPlatform.szUserUin, CountArray(LogonOtherPlatform.szUserUin));
  1167. lstrcpyn(LogonOtherPlatform.szNickName, pLogonOtherPlatform.szNickName, CountArray(LogonOtherPlatform.szNickName));
  1168. lstrcpyn(LogonOtherPlatform.szMachineID, pLogonOtherPlatform.szMachineID, CountArray(LogonOtherPlatform.szMachineID));
  1169. lstrcpyn(LogonOtherPlatform.szMobilePhone, pLogonOtherPlatform.szMobilePhone, CountArray(LogonOtherPlatform.szMobilePhone));
  1170. lstrcpyn(LogonOtherPlatform.szCompellation, pLogonOtherPlatform.szCompellation, CountArray(LogonOtherPlatform.szCompellation));
  1171. lstrcpyn(LogonOtherPlatform.szHeadUrl, pLogonOtherPlatform.szHeadUrl, CountArray(LogonOtherPlatform.szHeadUrl));
  1172. LogonOtherPlatform.x = pLogonOtherPlatform.x;
  1173. LogonOtherPlatform.y = pLogonOtherPlatform.y;
  1174. LogonOtherPlatform.isSimulator = pLogonOtherPlatform.cbDeviceType;
  1175. LogonOtherPlatform.networkType = pLogonOtherPlatform.networkType;
  1176. LogonOtherPlatform.dianliang = pLogonOtherPlatform.dianliang;
  1177. //投递请求
  1178. m_pIDataBaseEngine->PostDataBaseRequest(DBR_MB_LOGON_OTHERPLATFORM, dwSocketID, &LogonOtherPlatform, sizeof(LogonOtherPlatform));
  1179. return true;
  1180. }
  1181. //手机号码校验
  1182. bool CAttemperEngineSink::OnDBPCYanZhengMSuccess(DWORD dwContextID, VOID * pData, WORD wDataSize)
  1183. {
  1184. if ((m_pBindParameter + LOWORD(dwContextID))->dwSocketID != dwContextID)
  1185. {
  1186. //构造提示
  1187. TCHAR szString[512] = TEXT("");
  1188. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败 [SOCKET核查失败]"));
  1189. //提示消息
  1190. CTraceService::TraceString(szString, TraceLevel_Normal);
  1191. return false;
  1192. }
  1193. //变量定义
  1194. CMD_MB_LogonCheckVerifCode* pCheckVerifCode = (CMD_MB_LogonCheckVerifCode*)pData;
  1195. if (pCheckVerifCode->bResult == 0)
  1196. {
  1197. GETDUILIEBASE_EX VerifCode;
  1198. ZeroMemory(&VerifCode, sizeof(GETDUILIEBASE_EX));
  1199. StringCchCat(VerifCode.szIphoneNum, 12, pCheckVerifCode->PhoneNum);
  1200. VerifCode.CommendID = 1; //校验手机验证码(只作透传)
  1201. VerifCode.dwSocketID = dwContextID;
  1202. CHttpClient::AddLog(dwContextID, VerifCode);
  1203. }
  1204. LogonServer::PB_CS_C_LogonCheckVerifCode pCheckVerif;
  1205. pCheckVerif.set_bresult(pCheckVerifCode->bResult);
  1206. std::string PhoneNum = CW2AEX<1024>(pCheckVerifCode->PhoneNum, CP_UTF8).m_psz;
  1207. pCheckVerif.set_phonenum(PhoneNum);
  1208. /*std::string strErrorDescribe = CW2AEX<1024>(pCheckVerifCode->strErrorDescribe, CP_UTF8).m_psz;
  1209. pCheckVerif.set_strerrordescribe(strErrorDescribe);*/
  1210. //发送数据
  1211. std::string pbdata = pCheckVerif.SerializePartialAsString();
  1212. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_YANZM, 1, (void*)pbdata.c_str(), pbdata.length());
  1213. //关闭连接
  1214. if (pCheckVerifCode->bResult != 0)
  1215. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1216. return true;
  1217. }
  1218. //登录成功
  1219. bool CAttemperEngineSink::OnDBMBLogonSuccess(DWORD dwContextID, VOID * pData, WORD wDataSize)
  1220. {
  1221. //判断在线
  1222. ASSERT(LOWORD(dwContextID) < m_pInitParameter->m_wMaxConnect);
  1223. if ((m_pBindParameter + LOWORD(dwContextID))->dwSocketID != dwContextID)
  1224. {
  1225. //构造提示
  1226. TCHAR szString[512] = TEXT("");
  1227. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败 [SOCKET核查失败]"));
  1228. //提示消息
  1229. CTraceService::TraceString(szString, TraceLevel_Normal);
  1230. return false;
  1231. }
  1232. //变量定义
  1233. DBO_MB_LogonSuccess * pDBOLogonSuccess = (DBO_MB_LogonSuccess *)pData;
  1234. LogonServer::PB_CS_S_LogonSuccess pLogonSuccess;
  1235. pLogonSuccess.set_wfaceid(pDBOLogonSuccess->wFaceID);
  1236. pLogonSuccess.set_cbgender(pDBOLogonSuccess->cbGender);
  1237. pLogonSuccess.set_dwcustomid(pDBOLogonSuccess->dwCustomID);
  1238. pLogonSuccess.set_dwgameid(pDBOLogonSuccess->dwGameID);
  1239. pLogonSuccess.set_dwuserid(pDBOLogonSuccess->dwUserID);
  1240. pLogonSuccess.set_dwexperience(pDBOLogonSuccess->dwExperience);
  1241. pLogonSuccess.set_dwloveliness(pDBOLogonSuccess->dwLoveLiness);
  1242. std::string szNickName = CW2AEX<1024>(pDBOLogonSuccess->szNickName, CP_UTF8).m_psz;
  1243. std::string szDynamicPass = CW2AEX<1024>(pDBOLogonSuccess->szDynamicPass, CP_UTF8).m_psz;
  1244. pLogonSuccess.set_sznickname(szNickName);
  1245. pLogonSuccess.set_szdynamicpass(szDynamicPass);
  1246. pLogonSuccess.set_luserscore(pDBOLogonSuccess->lUserScore);
  1247. pLogonSuccess.set_luseringot(pDBOLogonSuccess->lUserIngot);
  1248. pLogonSuccess.set_luserinsure(pDBOLogonSuccess->lUserInsure);
  1249. pLogonSuccess.set_duserbeans(pDBOLogonSuccess->dUserBeans);
  1250. pLogonSuccess.set_cbinsureenabled(pDBOLogonSuccess->cbInsureEnabled);
  1251. pLogonSuccess.set_bingding(pDBOLogonSuccess->BingDing);
  1252. std::string pbdata = pLogonSuccess.SerializePartialAsString();
  1253. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_SUCCESS, (void*)pbdata.c_str(), pbdata.length());
  1254. //------发送用户服务器ID--------
  1255. //构造结构
  1256. CMD_GP_UserServerID UserServerID;
  1257. ZeroMemory(&UserServerID, sizeof(UserServerID));
  1258. UserServerID.wServerID = 0;
  1259. m_MapServerUserID.Lookup(pDBOLogonSuccess->dwUserID, UserServerID.wServerID);
  1260. if (UserServerID.wServerID != 0 && m_ServerListManager.SearchGameServer(UserServerID.wServerID) == NULL)
  1261. {
  1262. TCHAR szString[512] = TEXT("");
  1263. _sntprintf(szString, CountArray(szString), TEXT("未找到上次游戏节点ID=%d,用户ID=%d"), UserServerID.wServerID, pDBOLogonSuccess->dwUserID);
  1264. //提示消息
  1265. CTraceService::TraceString(szString, TraceLevel_Warning);
  1266. UserServerID.wServerID = 0;
  1267. }
  1268. LogonServer::PB_CS_S_UserServerID ServerID;
  1269. ServerID.set_wserverid(UserServerID.wServerID);
  1270. std::string bdata = ServerID.SerializePartialAsString();
  1271. m_pITCPNetworkEngine->SendData(dwContextID, MDM_GP_USER_SERVICE, SUB_GP_USER_SERVER_ID, (void*)bdata.c_str(), bdata.length());
  1272. //发送房间
  1273. WORD wIndex = LOWORD(dwContextID);
  1274. int iRet = SendMobileServerInfo(dwContextID, (m_pBindParameter + wIndex)->wModuleID, pDBOLogonSuccess->dwXinYong, UserServerID.wServerID, pDBOLogonSuccess->dwUserID, pDBOLogonSuccess->llJuLi);
  1275. if (iRet == -1)
  1276. {
  1277. TCHAR szString[512] = TEXT("");
  1278. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败 [游戏服务器未开启]"));
  1279. //提示消息
  1280. CTraceService::TraceString(szString, TraceLevel_Normal);
  1281. LogonServer::PB_CS_S_LogonFailure pLogonFailures;
  1282. pLogonFailures.set_lresultcode(-1);
  1283. std::string szDescribeString = CW2AEX<1024>(TEXT("出错代码:0x01,当前无可用服务器,请稍后再试."), CP_UTF8).m_psz;
  1284. pLogonFailures.set_szdescribestring(szDescribeString);
  1285. //发送数据
  1286. std::string pbdata = pLogonFailures.SerializePartialAsString();
  1287. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_SUCCESS, (void*)pbdata.c_str(), pbdata.length());
  1288. //关闭连接
  1289. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1290. }
  1291. else if (iRet == 0)
  1292. {
  1293. TCHAR szString[512] = TEXT("");
  1294. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败iRet=0 [无此账号可用游戏服务器] 此账号级别[%d]"), pDBOLogonSuccess->dwXinYong);
  1295. //提示消息
  1296. CTraceService::TraceString(szString, TraceLevel_Normal);
  1297. LogonServer::PB_CS_S_LogonFailure pLogonFailures;
  1298. pLogonFailures.set_lresultcode(-1);
  1299. std::string szDescribeString = CW2AEX<1024>(TEXT("出错代码:0x02,当前无可用服务器,请稍后再试."), CP_UTF8).m_psz;
  1300. pLogonFailures.set_szdescribestring(szDescribeString);
  1301. //发送数据
  1302. std::string pbdata = pLogonFailures.SerializePartialAsString();
  1303. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_SUCCESS, (void*)pbdata.c_str(), pbdata.length());
  1304. //关闭连接
  1305. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1306. }
  1307. else if (iRet == -2)
  1308. {
  1309. TCHAR szString[512] = TEXT("");
  1310. _sntprintf(szString, CountArray(szString), TEXT("客户端登录失败iRet=-2 [无此账号可用游戏服务器] 此账号级别[%d]"), pDBOLogonSuccess->dwXinYong);
  1311. //提示消息
  1312. CTraceService::TraceString(szString, TraceLevel_Normal);
  1313. LogonServer::PB_CS_S_LogonFailure pLogonFailures;
  1314. pLogonFailures.set_lresultcode(-1);
  1315. std::string szDescribeString = CW2AEX<1024>(TEXT("出错代码:0x03,当前无可用服务器,请稍后再试."), CP_UTF8).m_psz;
  1316. pLogonFailures.set_szdescribestring(szDescribeString);
  1317. //发送数据
  1318. std::string pbdata = pLogonFailures.SerializePartialAsString();
  1319. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_SUCCESS, (void*)pbdata.c_str(), pbdata.length());
  1320. //关闭连接
  1321. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1322. }
  1323. return true;
  1324. }
  1325. std::string CAttemperEngineSink::string_To_UTF8(LPCSTR str, DWORD dwSize)
  1326. {
  1327. int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
  1328. wchar_t* pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴
  1329. ZeroMemory(pwBuf, nwLen * 2 + 2);
  1330. ::MultiByteToWideChar(CP_ACP, 0, str, dwSize, pwBuf, nwLen);
  1331. int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
  1332. char* pBuf = new char[nLen + 1];
  1333. ZeroMemory(pBuf, nLen + 1);
  1334. ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
  1335. std::string retStr(pBuf);
  1336. delete[]pwBuf;
  1337. delete[]pBuf;
  1338. pwBuf = NULL;
  1339. pBuf = NULL;
  1340. return retStr;
  1341. }
  1342. //登录失败
  1343. bool CAttemperEngineSink::OnDBMBLogonFailure(DWORD dwContextID, VOID * pData, WORD wDataSize)
  1344. {
  1345. //判断在线
  1346. ASSERT(LOWORD(dwContextID) < m_pInitParameter->m_wMaxConnect);
  1347. if ((m_pBindParameter + LOWORD(dwContextID))->dwSocketID != dwContextID) return true;
  1348. //变量定义
  1349. DBO_MB_LogonFailure * pLogonFailure = (DBO_MB_LogonFailure *)pData;
  1350. LogonServer::PB_CS_S_LogonFailure pLogonFailures;
  1351. pLogonFailures.set_lresultcode(pLogonFailure->lResultCode);
  1352. std::string add = CW2AEX<1024>(pLogonFailure->szDescribeString, CP_UTF8).m_psz;
  1353. pLogonFailures.set_szdescribestring(add);
  1354. //发送数据
  1355. std::string pbdata = pLogonFailures.SerializePartialAsString();
  1356. m_pITCPNetworkEngine->SendData(dwContextID, MDM_MB_LOGON, SUB_MB_LOGON_FAILURE, (void*)pbdata.c_str(), pbdata.length());
  1357. //关闭连接
  1358. m_pITCPNetworkEngine->ShutDownSocket(dwContextID);
  1359. return true;
  1360. }
  1361. bool CAttemperEngineSink::OnDBPCGameListResult(DWORD dwContextID, VOID * pData, WORD wDataSize)
  1362. {
  1363. //效验参数
  1364. ASSERT(wDataSize == sizeof(DBO_GP_GameListResult));
  1365. if (wDataSize != sizeof(DBO_GP_GameListResult)) return false;
  1366. //变量定义
  1367. DBO_GP_GameListResult * pGameListResult = (DBO_GP_GameListResult *)pData;
  1368. //消息处理
  1369. if (pGameListResult->cbSuccess == TRUE)
  1370. {
  1371. //清理列表
  1372. m_ServerListManager.CleanKernelItem();
  1373. //事件通知
  1374. CP_ControlResult ControlResult;
  1375. ControlResult.cbSuccess = ER_SUCCESS;
  1376. SendUIControlPacket(UI_LOAD_DB_LIST_RESULT, &ControlResult, sizeof(ControlResult));
  1377. //设置时间
  1378. ASSERT(m_pITimerEngine != NULL);
  1379. m_pITimerEngine->SetTimer(IDI_LOAD_GAME_LIST, m_pInitParameter->m_wLoadListTime * 1000L, 1, 0);
  1380. }
  1381. else
  1382. {
  1383. //构造提示
  1384. TCHAR szDescribe[128] = TEXT("");
  1385. _sntprintf(szDescribe, CountArray(szDescribe), TEXT("服务器列表加载失败,%ld 秒后将重新加载"), m_pInitParameter->m_wReLoadListTime);
  1386. //提示消息
  1387. CTraceService::TraceString(szDescribe, TraceLevel_Warning);
  1388. //设置时间
  1389. ASSERT(m_pITimerEngine != NULL);
  1390. m_pITimerEngine->SetTimer(IDI_LOAD_GAME_LIST, m_pInitParameter->m_wReLoadListTime * 1000L, 1, 0);
  1391. }
  1392. return true;
  1393. }
  1394. //版本检测
  1395. bool CAttemperEngineSink::CheckPlazaVersion(BYTE cbDeviceType, DWORD dwPlazaVersion, DWORD dwSocketID, bool bCheckLowVer)
  1396. {
  1397. //变量定义
  1398. bool bMustUpdate = false;
  1399. bool bAdviceUpdate = false;
  1400. DWORD dwVersion = VERSION_PLAZA;
  1401. //手机版本
  1402. if (cbDeviceType >= DEVICE_TYPE_IPAD) dwVersion = VERSION_MOBILE_IOS;
  1403. else if (cbDeviceType >= DEVICE_TYPE_IPHONE) dwVersion = VERSION_MOBILE_IOS;
  1404. else if (cbDeviceType >= DEVICE_TYPE_ITOUCH) dwVersion = VERSION_MOBILE_IOS;
  1405. else if (cbDeviceType >= DEVICE_TYPE_ANDROID) dwVersion = VERSION_MOBILE_ANDROID;
  1406. else if (cbDeviceType == DEVICE_TYPE_PC) dwVersion = VERSION_PLAZA;
  1407. //版本判断
  1408. if (bCheckLowVer && GetSubVer(dwPlazaVersion) < GetSubVer(dwVersion)) bAdviceUpdate = true;
  1409. if (GetMainVer(dwPlazaVersion) != GetMainVer(dwVersion)) bMustUpdate = true;
  1410. if (GetProductVer(dwPlazaVersion) != GetProductVer(dwVersion)) bMustUpdate = true;
  1411. //升级判断
  1412. if ((bMustUpdate == true) || (bAdviceUpdate == true))
  1413. {
  1414. ////变量定义
  1415. //CMD_GP_UpdateNotify UpdateNotify;
  1416. //ZeroMemory(&UpdateNotify, sizeof(UpdateNotify));
  1417. ////变量定义
  1418. //UpdateNotify.cbMustUpdate = bMustUpdate;
  1419. //UpdateNotify.cbAdviceUpdate = bAdviceUpdate;
  1420. //UpdateNotify.dwCurrentVersion = dwVersion;
  1421. //发送消息 mod 2019-12-26
  1422. //m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GP_LOGON, SUB_GP_UPDATE_NOTIFY, &UpdateNotify, sizeof(UpdateNotify));
  1423. //中断判断
  1424. if (bMustUpdate == true)
  1425. {
  1426. m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
  1427. return false;
  1428. }
  1429. }
  1430. return true;
  1431. }
  1432. //发送请求
  1433. bool CAttemperEngineSink::SendUIControlPacket(WORD wRequestID, VOID * pData, WORD wDataSize)
  1434. {
  1435. //发送数据
  1436. CServiceUnits * pServiceUnits = CServiceUnits::g_pServiceUnits;
  1437. pServiceUnits->PostControlRequest(wRequestID, pData, wDataSize);
  1438. return true;
  1439. }
  1440. // 函数对象
  1441. class SortByLineCountFunc
  1442. {
  1443. public:
  1444. int operator()(CGameServerItem* l, CGameServerItem* r)
  1445. {
  1446. return l->m_GameServer.dwOnLineCount < r->m_GameServer.dwOnLineCount;
  1447. }
  1448. };
  1449. class SortCountFunc
  1450. {
  1451. public:
  1452. int operator()(LONGLONG l, LONGLONG r)
  1453. {
  1454. return l< r;
  1455. }
  1456. };
  1457. //发送房间
  1458. int CAttemperEngineSink::SendMobileServerInfo(DWORD dwSocketID, WORD wModuleID, DWORD dwXinYong, DWORD wServerID, DWORD dUserID, LONGLONG JuLi)
  1459. {
  1460. //CTraceService::TraceString(L"发送房间", TraceLevel_Warning);
  1461. std::wstring ip;
  1462. //网络数据
  1463. WORD wSendSize = 0;
  1464. BYTE cbDataBuffer[SOCKET_TCP_PACKET];
  1465. ZeroMemory(cbDataBuffer, SOCKET_TCP_PACKET);
  1466. //枚举数据
  1467. POSITION Position = NULL;
  1468. CGameServerItem* pGameServerItem = NULL;
  1469. //计算距离排名
  1470. int iPaiMing = 0; int iCountMax = 1;
  1471. GetPaiMing(dUserID, JuLi, iPaiMing, iCountMax);
  1472. if (wServerID != 0)
  1473. {
  1474. pGameServerItem = m_ServerListManager.SearchGameServer(wServerID);
  1475. if (pGameServerItem)
  1476. {
  1477. ip = pGameServerItem->GetRandom(dUserID, iPaiMing, iCountMax);//获取通道
  1478. if (ip == L"")
  1479. {
  1480. TCHAR szString[512] = TEXT("");
  1481. _sntprintf(szString, CountArray(szString), TEXT("未找到上次游戏节点ID=%d 的可用通道,用户ID=%d"), wServerID,dUserID);
  1482. //提示消息
  1483. CTraceService::TraceString(szString, TraceLevel_Warning);
  1484. goto end1; //获取通道失败,没能力给予断线重连。分配其他服务器IP,重新进入游戏。
  1485. }
  1486. tagGameServer temp;
  1487. ZeroMemory(&temp, sizeof(tagGameServer));
  1488. CopyMemory(&temp, &(pGameServerItem->m_GameServer), sizeof(tagGameServer));
  1489. ZeroMemory(temp.szServerAddr, sizeof(TCHAR) * 32);
  1490. StringCbCat(temp.szServerAddr, 32, ip.c_str());
  1491. LogonServer::PB_CS_S_tagGameServer tagGameServer;
  1492. tagGameServer.set_wkindid(pGameServerItem->m_GameServer.wKindID);
  1493. tagGameServer.set_wnodeid(pGameServerItem->m_GameServer.wNodeID);
  1494. tagGameServer.set_wsortid(pGameServerItem->m_GameServer.wSortID);
  1495. tagGameServer.set_wserverid(pGameServerItem->m_GameServer.wServerID);
  1496. tagGameServer.set_wserverkind(pGameServerItem->m_GameServer.wServerKind);
  1497. tagGameServer.set_wservertype(pGameServerItem->m_GameServer.wServerType);
  1498. tagGameServer.set_wserverport(pGameServerItem->m_GameServer.wServerPort);
  1499. tagGameServer.set_lcellscore(pGameServerItem->m_GameServer.lCellScore);
  1500. tagGameServer.set_lcellscore(pGameServerItem->m_GameServer.lEnterScore);
  1501. tagGameServer.set_dwserverrule(pGameServerItem->m_GameServer.dwServerRule);
  1502. tagGameServer.set_dwonlinecount(pGameServerItem->m_GameServer.dwOnLineCount);
  1503. tagGameServer.set_wtablefullcount(pGameServerItem->m_GameServer.wTableFullCount);
  1504. tagGameServer.set_wtableonlinecount(pGameServerItem->m_GameServer.wTableOnlineCount);
  1505. tagGameServer.set_dwfullcount(pGameServerItem->m_GameServer.dwFullCount);
  1506. std::string szServerAddr = CW2AEX<1024>(temp.szServerAddr, CP_UTF8).m_psz;
  1507. std::string szServerName = CW2AEX<1024>(pGameServerItem->m_GameServer.szServerName, CP_UTF8).m_psz;
  1508. tagGameServer.set_szserveraddr(szServerAddr);
  1509. tagGameServer.set_szservername(szServerName);
  1510. tagGameServer.set_dwlivetime(pGameServerItem->m_GameServer.dwLiveTime);
  1511. tagGameServer.set_wserverlevel(pGameServerItem->m_GameServer.wServerLevel);
  1512. std::string pbdata = tagGameServer.SerializePartialAsString();
  1513. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_MB_SERVER_LIST, SUB_MB_LIST_SERVER, (void*)pbdata.c_str(), pbdata.length());
  1514. TCHAR szString[512] = TEXT("");
  1515. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1516. _sntprintf(szString, CountArray(szString), TEXT("发送可用服务器[%d]-> %s:%d 通道->%s level:%d UserLevel:%d UserID:%d")
  1517. , (pGameServerItem->m_GameServer).wServerID, pGameServerItem->m_GameServer.szServerAddr, pGameServerItem->m_GameServer.wServerPort, ip.c_str(), pGameServerItem->m_GameServer.wServerLevel, dwXinYong, dUserID);
  1518. //提示消息
  1519. CTraceService::TraceString(szString, TraceLevel_Normal);
  1520. return 1;
  1521. }
  1522. }
  1523. end1:
  1524. int iNum = m_ServerListManager.GetGameServerCount();
  1525. if (iNum == 0)
  1526. {
  1527. LogonServer::PB_CS_S_tagGameServer tagGameServer;
  1528. std::string pbdata = tagGameServer.SerializePartialAsString();
  1529. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_MB_SERVER_LIST, SUB_MB_LIST_SERVER, (void*)pbdata.c_str(), pbdata.length());
  1530. return -1;
  1531. }
  1532. CList<CGameServerItem*> List;
  1533. for (DWORD i = 0; i < m_ServerListManager.GetGameServerCount(); i++)
  1534. {
  1535. //获取数据
  1536. pGameServerItem = m_ServerListManager.EmunGameServerItem(Position);
  1537. if (pGameServerItem == NULL) break;
  1538. ///---过滤掉金币场的GameServer
  1539. if (pGameServerItem->m_GameServer.wNodeID > 0)
  1540. {
  1541. CTraceService::TraceString(L"过滤掉一个金币场房间", TraceLevel_Normal);
  1542. continue;
  1543. }
  1544. if (pGameServerItem->m_GameServer.dwOnLineCount >= pGameServerItem->m_GameServer.dwFullCount)
  1545. {
  1546. if (wServerID != pGameServerItem->m_GameServer.wServerID || wServerID == 0)
  1547. {
  1548. TCHAR szString[512] = TEXT("");
  1549. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1550. _sntprintf(szString, CountArray(szString), TEXT("wServerID=%d,pGameServerItem->m_GameServer.wServerID=%d")
  1551. , wServerID, pGameServerItem->m_GameServer.wServerID);
  1552. //提示消息
  1553. CTraceService::TraceString(szString, TraceLevel_Normal);
  1554. continue;
  1555. }
  1556. }
  1557. if (pGameServerItem->m_GameServer.wServerLevel > dwXinYong)
  1558. {
  1559. if (wServerID != pGameServerItem->m_GameServer.wServerID || wServerID == 0)
  1560. {
  1561. TCHAR szString[512] = TEXT("");
  1562. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1563. _sntprintf(szString, CountArray(szString), TEXT("wServerLevel=%d,dwXinYong=%d")
  1564. , pGameServerItem->m_GameServer.wServerLevel, dwXinYong);
  1565. //提示消息
  1566. CTraceService::TraceString(szString, TraceLevel_Normal);
  1567. continue;
  1568. }
  1569. }
  1570. if (pGameServerItem->m_GameServer.bService < 1)
  1571. {
  1572. if (wServerID != pGameServerItem->m_GameServer.wServerID || wServerID == 0)
  1573. {
  1574. if (pGameServerItem->m_GameServer.bService < 0 && pGameServerItem->m_GameServer.wServerLevel == 1 && dwXinYong < 2)
  1575. {
  1576. }
  1577. else
  1578. {
  1579. TCHAR szString[512] = TEXT("");
  1580. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1581. _sntprintf(szString, CountArray(szString), TEXT("bService=%d")
  1582. , pGameServerItem->m_GameServer.bService);
  1583. //提示消息
  1584. CTraceService::TraceString(szString, TraceLevel_Normal);
  1585. continue;
  1586. }
  1587. }
  1588. }
  1589. List.AddTail(pGameServerItem);
  1590. }
  1591. int iCount = List.GetCount();
  1592. if (iCount == 0)
  1593. {
  1594. return -2;
  1595. }
  1596. int iCheckLevel = -1;
  1597. iCheckLevel = dwXinYong < 9 ? dwXinYong : 2;
  1598. CGameServerItem* pRet = NULL;
  1599. for (int i = iCheckLevel; i > 0; i--)
  1600. {
  1601. CGameServerItem* pwip = GetServiceLevel(i, &List, dUserID, iPaiMing, iCountMax);
  1602. if (pwip != NULL)
  1603. {
  1604. pRet = pwip;
  1605. ip = pwip->m_GameServer.szServerAddr;
  1606. if (ip != L"")
  1607. {
  1608. goto end2;
  1609. }
  1610. }
  1611. }
  1612. if (ip == L"")
  1613. {
  1614. TCHAR szString[512] = TEXT("");
  1615. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1616. _sntprintf(szString, CountArray(szString), TEXT("IP为空-> 数量:%d iPaiMing:%d iCountMax:%d ")
  1617. , List.GetCount(), iPaiMing, iCountMax);
  1618. //提示消息
  1619. CTraceService::TraceString(szString, TraceLevel_Normal);
  1620. List.RemoveAll();
  1621. TRACE("\n%s - %d : ip is empty", __FUNCTION__, __LINE__);
  1622. return 0;
  1623. }
  1624. end2:
  1625. List.RemoveAll();
  1626. if (pRet)
  1627. {
  1628. TCHAR szString[512] = TEXT("");
  1629. ZeroMemory(szString, sizeof(TCHAR)*512);
  1630. _sntprintf(szString, CountArray(szString), TEXT("发送可用服务器[%d]-> %s:%d 通道->%s level:%d UserLevel:%d UserID:%d")
  1631. , (pRet->m_GameServer).wServerID, pRet->m_GameServer.szServerAddr, pRet->m_GameServer.wServerPort, ip.c_str(), pRet->m_GameServer.wServerLevel, dwXinYong, dUserID);
  1632. //提示消息
  1633. CTraceService::TraceString(szString, TraceLevel_Normal);
  1634. tagGameServer temp;
  1635. ZeroMemory(&temp, sizeof(tagGameServer));
  1636. CopyMemory(&temp, &(pRet->m_GameServer), sizeof(tagGameServer));
  1637. ZeroMemory(temp.szServerAddr, sizeof(TCHAR)*32);
  1638. StringCbCat(temp.szServerAddr, 32, ip.c_str());
  1639. LogonServer::PB_CS_S_tagGameServer tagGameServer;
  1640. tagGameServer.set_wkindid(temp.wKindID);
  1641. tagGameServer.set_wnodeid(temp.wNodeID);
  1642. tagGameServer.set_wsortid(temp.wSortID);
  1643. tagGameServer.set_wserverid(temp.wServerID);
  1644. tagGameServer.set_wserverkind(temp.wServerKind);
  1645. tagGameServer.set_wservertype(temp.wServerType);
  1646. tagGameServer.set_wserverport(temp.wServerPort);
  1647. tagGameServer.set_lcellscore(temp.lCellScore);
  1648. tagGameServer.set_lcellscore(temp.lEnterScore);
  1649. tagGameServer.set_dwserverrule(temp.dwServerRule);
  1650. tagGameServer.set_dwonlinecount(temp.dwOnLineCount);
  1651. tagGameServer.set_wtablefullcount(temp.wTableFullCount);
  1652. tagGameServer.set_wtableonlinecount(temp.wTableOnlineCount);
  1653. tagGameServer.set_dwfullcount(temp.dwFullCount);
  1654. std::string szServerAddr = CW2AEX<1024>(temp.szServerAddr, CP_UTF8).m_psz;
  1655. std::string szServerName = CW2AEX<1024>(temp.szServerName, CP_UTF8).m_psz;
  1656. tagGameServer.set_szserveraddr(szServerAddr);
  1657. tagGameServer.set_szservername(szServerName);
  1658. tagGameServer.set_dwlivetime(temp.dwLiveTime);
  1659. tagGameServer.set_wserverlevel(temp.wServerLevel);
  1660. std::string pbdata = tagGameServer.SerializePartialAsString();
  1661. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_MB_SERVER_LIST, SUB_MB_LIST_SERVER, (void*)pbdata.c_str(), pbdata.length());
  1662. }
  1663. else
  1664. {
  1665. TCHAR szString[512] = TEXT("");
  1666. ZeroMemory(szString, sizeof(TCHAR) * 512);
  1667. _sntprintf(szString, CountArray(szString), TEXT("IP为空2-> 数量:%d iPaiMing:%d iCountMax:%d ")
  1668. , List.GetCount(), iPaiMing, iCountMax);
  1669. //提示消息
  1670. CTraceService::TraceString(szString, TraceLevel_Normal);
  1671. return 0;
  1672. }
  1673. return 1;
  1674. }
  1675. //获取距离排名
  1676. bool CAttemperEngineSink::GetPaiMing(DWORD dUserID, LONGLONG JuLi, int& iPaiMing, int& iCount)
  1677. {
  1678. iPaiMing = 0;
  1679. iCount = 1;
  1680. //枚举数据
  1681. CDataBaseEngineSink::m_MapUserIDJuli[dUserID] = JuLi;
  1682. std::vector<LONGLONG> vecJuLi;
  1683. DWORD dUser;
  1684. LONGLONG llJuLi;
  1685. POSITION pos = CDataBaseEngineSink::m_MapUserIDJuli.GetStartPosition();
  1686. while (pos)
  1687. {
  1688. CDataBaseEngineSink::m_MapUserIDJuli.GetNextAssoc(pos, dUser, llJuLi);
  1689. vecJuLi.push_back(llJuLi);
  1690. }
  1691. iCount = vecJuLi.size();
  1692. std::sort(vecJuLi.begin(), vecJuLi.end(), SortCountFunc());
  1693. int count = vecJuLi.size();
  1694. for (int i = 0; i < count; i++)
  1695. {
  1696. if (vecJuLi[i] == JuLi)
  1697. {
  1698. iPaiMing = i;
  1699. break;
  1700. }
  1701. }
  1702. vecJuLi.clear();
  1703. return true;
  1704. }
  1705. //////////////////////////////////////////////////////////////////////////////////
  1706. void CAttemperEngineSink::Fstring(TCHAR* pCheck)
  1707. {
  1708. for (int i = 0; i < 32; i++)
  1709. {
  1710. try
  1711. {
  1712. WORD bb = pCheck[i];
  1713. if ((bb > 126 && bb < 19968)
  1714. || (bb > 40869)
  1715. || bb < 33)
  1716. {
  1717. if (pCheck[i] == 0x00) break;
  1718. pCheck[i] = L' ';
  1719. }
  1720. }
  1721. catch (...)
  1722. {
  1723. }
  1724. }
  1725. }
  1726. // 获取可用服务器
  1727. CGameServerItem* CAttemperEngineSink::GetServiceLevel(int iLevel, CList<CGameServerItem*>* List, DWORD UserID, int iPaiMing, int iCount)
  1728. {
  1729. CGameServerItem* pCGameServerItem = NULL;
  1730. std::vector<CGameServerItem*> vecServer;
  1731. POSITION posA = List->GetHeadPosition();
  1732. while (posA)
  1733. {
  1734. CGameServerItem* ptagGameServer = List->GetNext(posA);
  1735. if (ptagGameServer
  1736. &&ptagGameServer->m_GameServer.wServerLevel == iLevel)
  1737. {
  1738. vecServer.push_back(ptagGameServer);
  1739. }
  1740. }
  1741. std::sort(vecServer.begin(), vecServer.end(), SortByLineCountFunc());
  1742. for (BYTE i = 0; i < vecServer.size(); i++)
  1743. {
  1744. CGameServerItem* ptagGameServer = vecServer[i];
  1745. if (ptagGameServer&&ptagGameServer->m_GameServer.dwOnLineCount < ptagGameServer->m_GameServer.dwFullCount)
  1746. {
  1747. if (ptagGameServer->GetRandom(UserID, iPaiMing, iCount) == L"") continue;
  1748. pCGameServerItem = ptagGameServer;
  1749. break;
  1750. }
  1751. }
  1752. return pCGameServerItem;
  1753. }