诸暨麻将添加redis
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

2102 Zeilen
69 KiB

  1. #include "StdAfx.h"
  2. #include "AttemperEngineSink.h"
  3. #include "GetRandom.h"
  4. #include "CorrespondServer.h"
  5. #include "CorrespondServerDlg.h"
  6. extern CCorrespondServerApp theApp;
  7. //////////////////////////////////////////////////////////////////////////////////
  8. //定时器定义
  9. #define IDI_LOAD_PLATFORM_PARAMETER 1 //加载参数
  10. #define IDI_CHK_GAME_SERVER 2 //心跳
  11. #define IDI_LOAD_SEND_LIST 3 //轮训数据库
  12. #define TIME_LOAD_PLATFORM_PARAMETER 600000 //时间间隔
  13. #define IDI_ROOM 4 //检查清楚超时房间
  14. #define TIME_ROOM_PARAMETER 60*1000 //时间间隔1分钟
  15. ///[---add by yd
  16. #define TIMER_ID_CHK_LOGON_SERVER 6 //检查LogonServer的定时器id
  17. #define TIMES_CHECK_LOGONSERVER 2*TIMES_LOGONSERVER_HEARTBEAT //检查LogonServer的定时器的时间间隔
  18. ///---]
  19. //////////////////////////////////////////////////////////////////////////////////
  20. //构造函数
  21. CAttemperEngineSink::CAttemperEngineSink()
  22. {
  23. //状态变量
  24. m_wCollectItem = INVALID_WORD;
  25. //设置变量
  26. m_pInitParameter = NULL;
  27. m_pBindParameter = NULL;
  28. //组件变量
  29. m_pITimerEngine = NULL;
  30. m_pITCPNetworkEngine = NULL;
  31. m_GlobalInfoManager.SetFromP(this);
  32. return;
  33. }
  34. //析构函数
  35. CAttemperEngineSink::~CAttemperEngineSink()
  36. {
  37. }
  38. //接口查询
  39. VOID * CAttemperEngineSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
  40. {
  41. QUERYINTERFACE(IAttemperEngineSink, Guid, dwQueryVer);
  42. QUERYINTERFACE_IUNKNOWNEX(IAttemperEngineSink, Guid, dwQueryVer);
  43. return NULL;
  44. }
  45. //启动事件
  46. bool CAttemperEngineSink::OnAttemperEngineStart(IUnknownEx * pIUnknownEx)
  47. {
  48. //绑定参数
  49. m_pBindParameter = new tagBindParameter[m_pInitParameter->m_wMaxConnect];
  50. ZeroMemory(m_pBindParameter, sizeof(tagBindParameter)*m_pInitParameter->m_wMaxConnect);
  51. //设置定时器
  52. #ifndef _DEBUG
  53. m_pITimerEngine->SetTimer(IDI_LOAD_PLATFORM_PARAMETER, TIME_LOAD_PLATFORM_PARAMETER, TIMES_INFINITY, 0);
  54. #else
  55. m_pITimerEngine->SetTimer(IDI_LOAD_PLATFORM_PARAMETER, 10*60*1000, TIMES_INFINITY, 0);
  56. #endif
  57. #ifdef _DEBUG
  58. m_pITimerEngine->SetTimer(IDI_CHK_GAME_SERVER, 3500, TIMES_INFINITY, 0);
  59. #else
  60. m_pITimerEngine->SetTimer(IDI_CHK_GAME_SERVER, 3500, TIMES_INFINITY, 0);
  61. #endif
  62. //m_pITimerEngine->SetTimer(IDI_CHK_GAME_SERVER, 3500, TIMES_INFINITY, 0);
  63. m_pITimerEngine->SetTimer(IDI_ROOM, TIME_ROOM_PARAMETER, TIMES_INFINITY, 0);
  64. ///[---add by yd 检查登录服务器
  65. m_pITimerEngine->SetTimer(TIMER_ID_CHK_LOGON_SERVER, TIMES_CHECK_LOGONSERVER, TIMES_INFINITY, 0);
  66. ///---]
  67. return true;
  68. }
  69. //停止事件
  70. bool CAttemperEngineSink::OnAttemperEngineConclude(IUnknownEx * pIUnknownEx)
  71. {
  72. //状态变量
  73. m_wCollectItem = INVALID_WORD;
  74. m_WaitCollectItemArray.RemoveAll();
  75. //设置变量
  76. m_pITimerEngine = NULL;
  77. m_pITCPNetworkEngine = NULL;
  78. //删除数据
  79. SafeDeleteArray(m_pBindParameter);
  80. //设置组件
  81. m_GlobalInfoManager.ResetData();
  82. m_GlobalInfoManager.SetFromP(this);
  83. ///+++2017-9-18清理下界面
  84. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  85. if (p)
  86. {
  87. while (true)
  88. {
  89. if (p->bbb.ItemHasChildren(p->hbbRoot))
  90. {
  91. HTREEITEM hChildItem = p->bbb.GetChildItem(p->hbbRoot);
  92. p->bbb.DeleteItem(hChildItem);
  93. }
  94. else
  95. {
  96. break;
  97. }
  98. }
  99. while (true)
  100. {
  101. if (p->ServiceTree.ItemHasChildren(p->hRoot))
  102. {
  103. HTREEITEM hChildItem = p->ServiceTree.GetChildItem(p->hRoot);
  104. p->ServiceTree.DeleteItem(hChildItem);
  105. }
  106. else
  107. {
  108. break;
  109. }
  110. }
  111. m_ServiceIDMap.RemoveAll();
  112. m_LoginServiceIDMap.RemoveAll();
  113. }
  114. return true;
  115. }
  116. //控制事件
  117. bool CAttemperEngineSink::OnEventControl(WORD wIdentifier, VOID * pData, WORD wDataSize)
  118. {
  119. return false;
  120. }
  121. //调度事件
  122. bool CAttemperEngineSink::OnEventAttemperData(WORD wRequestID, VOID * pData, WORD wDataSize)
  123. {
  124. return false;
  125. }
  126. //同步事件
  127. bool CAttemperEngineSink::OnTongBu(int Command, DWORD dwContextID, VOID * pData, WORD wDataSize)
  128. {
  129. return true;
  130. }
  131. //时间事件
  132. bool CAttemperEngineSink::OnEventTimer(DWORD dwTimerID, WPARAM wBindParam)
  133. {
  134. //加载参数
  135. if (IDI_LOAD_PLATFORM_PARAMETER == dwTimerID)
  136. {
  137. //发送通知
  138. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_PLATFORM_PARAMETER, 0, 0, 0L);
  139. return true;
  140. }
  141. else if (IDI_ROOM == dwTimerID)
  142. {
  143. CTime tm; tm = CTime::GetCurrentTime();
  144. if (tm.GetHour() == 4
  145. && (tm.GetMinute() == 0
  146. || tm.GetMinute() == 1))
  147. {
  148. //检测超时房间
  149. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  150. pCMapRoomList->RemoveAll();
  151. m_GlobalInfoManager.GetPrivateRoom()->RemoveAll();
  152. /*look3:
  153. POSITION pos = pCMapRoomList->GetStartPosition();
  154. while (pos)
  155. {
  156. DWORD dTest;
  157. JN_GR_RoomListGroup temp;
  158. ZeroMemory(&temp, sizeof(temp));
  159. pCMapRoomList->GetNextAssoc(pos, dTest, temp);
  160. int iNum = 0;
  161. if (temp.Num > 10) temp.Num = 10;
  162. look2:
  163. for (size_t i = 0; i <temp.Num; i++)
  164. {
  165. if (temp.jgrDate[i].dwRoomNumber != 0)
  166. {
  167. DWORD dTime = GetTickCount();
  168. if ((dTime - temp.jgrDate[i].InsertTime) > 1000 * 60 * 60 * 23)
  169. {
  170. //超过一天则清楚
  171. if (temp.Num == 0)
  172. {
  173. //清除这个人的信息
  174. pCMapRoomList->RemoveKey(dTest);
  175. CString csTest;
  176. csTest.Format(_T("超时清除 用户ID:%d"), dTest);
  177. CTraceService::TraceString(csTest, TraceLevel_Normal);
  178. goto look3;
  179. }
  180. else
  181. {
  182. DWORD dRoomID = 0;
  183. dRoomID = temp.jgrDate[i].dwRoomNumber;
  184. temp.jgrDate[i] = temp.jgrDate[temp.Num - 1];
  185. ZeroMemory(&(temp.jgrDate[temp.Num - 1]), sizeof(temp.jgrDate[temp.Num - 1]));
  186. CString csTest;
  187. csTest.Format(_T("超时清除 房间ID:%d"), dRoomID);
  188. CTraceService::TraceString(csTest, TraceLevel_Normal);
  189. if (temp.Num > 0) temp.Num--;
  190. }
  191. goto look2;
  192. }
  193. }
  194. }
  195. pCMapRoomList->SetAt(dTest, temp);
  196. }*/
  197. }
  198. return true;
  199. }
  200. else if (IDI_CHK_GAME_SERVER == dwTimerID)
  201. {
  202. POSITION Position = NULL;
  203. DWORD dwCurrentTime = (DWORD)time(NULL);
  204. bool bDel = false;
  205. do
  206. {
  207. //获取对象
  208. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position);
  209. //设置数据
  210. if (pGlobalServerItem != NULL)
  211. {
  212. if (dwCurrentTime - pGlobalServerItem->m_GameServer.dwLiveTime > SEVERTIMEOUT)
  213. {
  214. DWORD dTime = dwCurrentTime - pGlobalServerItem->m_GameServer.dwLiveTime;
  215. CString str;
  216. str.Format(TEXT("通讯失败超时断开,注销GameServer [%d]%s:%d, 超时时间%d 当前时间%d"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.szServerAddr, pGlobalServerItem->m_GameServer.wServerPort, dTime, dwCurrentTime);
  217. CTraceService::TraceString(str, TraceLevel_Warning);
  218. //变量定义
  219. CMD_CS_S_ServerRemove ServerRemove;
  220. ZeroMemory(&ServerRemove, sizeof(ServerRemove));
  221. //删除通知
  222. ServerRemove.wServerID = pGlobalServerItem->GetServerID();
  223. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_REMOVE, &ServerRemove, sizeof(ServerRemove), 0L);
  224. //注销房间
  225. m_GlobalInfoManager.DeleteServerItem(pGlobalServerItem->GetServerID());
  226. bDel = true;
  227. }
  228. }
  229. } while (Position != NULL);
  230. if (bDel)
  231. {
  232. Position = NULL;
  233. CTraceService::TraceString(TEXT("当前的GameServer列表:"), TraceLevel_Normal);
  234. do
  235. {
  236. //获取对象
  237. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position);
  238. if (pGlobalServerItem != NULL)
  239. {
  240. CString str;
  241. str.Format(TEXT("[%d] %s : %d"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.szServerAddr, pGlobalServerItem->m_GameServer.wServerPort);
  242. CTraceService::TraceString(str, TraceLevel_Normal);
  243. }
  244. } while (Position != NULL);
  245. }
  246. return true;
  247. }
  248. ///[--- add by yd 检查登录服务器是否掉线
  249. else if (TIMER_ID_CHK_LOGON_SERVER == dwTimerID)
  250. {
  251. //static int iCount = 0;
  252. //iCount++;
  253. POSITION Position = NULL;
  254. DWORD dwCurrentTime = GetTickCount(); ///--(DWORD)time(NULL);
  255. bool bDel = false;
  256. do
  257. {
  258. //获取对象
  259. CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.EnumPlazaItem(Position);
  260. //设置数据
  261. if (pGlobalServerItem != NULL)
  262. {
  263. ///---超过上报时间的3倍时长(即3次都没有收到心跳)
  264. if ((dwCurrentTime - pGlobalServerItem->m_GamePlaza.dwLiveTime) > 5 * TIMES_LOGONSERVER_HEARTBEAT)
  265. {
  266. DWORD dTime = dwCurrentTime - pGlobalServerItem->m_GamePlaza.dwLiveTime;
  267. CString str;
  268. str.Format(TEXT("**登录通讯失败超时断开,注销LogonServer [%d]%s, 超时时间%d 当前时间%d"),
  269. pGlobalServerItem->GetPlazaServerID(),
  270. pGlobalServerItem->m_GamePlaza.szServerAddr,
  271. dTime, dwCurrentTime);
  272. CTraceService::TraceString(str, TraceLevel_Warning);
  273. HTREEITEM hTemp;
  274. if (m_LoginServiceIDMap.Lookup(pGlobalServerItem->m_GamePlaza.wPlazaID, hTemp))
  275. {
  276. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  277. if (p)
  278. {
  279. p->bbb.DeleteItem(hTemp);
  280. }
  281. m_LoginServiceIDMap.RemoveKey(pGlobalServerItem->m_GamePlaza.wPlazaID);
  282. }
  283. else
  284. {
  285. //提示消息
  286. CString cstr = L"";
  287. cstr.Format(L"超过上报m_LoginServiceIDMap hTemp不存在:%d", pGlobalServerItem->m_GamePlaza.wPlazaID);
  288. CTraceService::TraceString(cstr, TraceLevel_Warning);
  289. //CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  290. //if (p)
  291. //{
  292. // CString csIpPort;
  293. // csIpPort.Format(L"%s:%s 编号[%d]", CString(pGlobalServerItem->m_GamePlaza.szServerAddr), pGlobalServerItem->m_GamePlaza.szServerName, pGlobalServerItem->m_GamePlaza.wPlazaID);
  294. // HTREEITEM aa = p->bbb.InsertItem(csIpPort, 1, 1, p->hbbRoot, TVI_LAST);
  295. // p->bbb.SetItemData(aa, 0);
  296. // m_LoginServiceIDMap[pGlobalServerItem->m_GamePlaza.wPlazaID] = aa;
  297. //}
  298. }
  299. //删除登录服务器
  300. m_GlobalInfoManager.DeletePlazaItem(pGlobalServerItem->m_GamePlaza.wPlazaID);
  301. bDel = true;
  302. }
  303. }
  304. } while (Position != NULL);
  305. if (bDel)
  306. {
  307. Position = NULL;
  308. CTraceService::TraceString(TEXT("当前的LogonServer列表:"), TraceLevel_Normal);
  309. do
  310. {
  311. //获取对象
  312. CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.EnumPlazaItem(Position);
  313. if (pGlobalServerItem != NULL)
  314. {
  315. CString str;
  316. str.Format(TEXT("[%d]-%s"), pGlobalServerItem->GetPlazaServerID(), pGlobalServerItem->m_GamePlaza.szServerAddr);
  317. CTraceService::TraceString(str, TraceLevel_Normal);
  318. }
  319. } while (Position != NULL);
  320. }
  321. return true;
  322. }
  323. return false;
  324. }
  325. //应答事件
  326. bool CAttemperEngineSink::OnEventTCPNetworkBind(DWORD dwClientAddr, DWORD dwSocketID)
  327. {
  328. //获取索引
  329. ASSERT(LOWORD(dwSocketID) < m_pInitParameter->m_wMaxConnect);
  330. if (LOWORD(dwSocketID) >= m_pInitParameter->m_wMaxConnect) return false;
  331. //变量定义
  332. WORD wBindIndex = LOWORD(dwSocketID);
  333. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  334. //设置变量
  335. pBindParameter->dwSocketID = dwSocketID;
  336. pBindParameter->dwClientAddr = dwClientAddr;
  337. pBindParameter->dwActiveTime = (DWORD)time(NULL);
  338. return true;
  339. }
  340. //读取事件
  341. bool CAttemperEngineSink::OnEventTCPNetworkRead(TCP_Command Command, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  342. {
  343. switch (Command.wMainCmdID)
  344. {
  345. case MDM_CS_REGISTER: //服务注册
  346. {
  347. return OnTCPNetworkMainRegister(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  348. }
  349. case MDM_CS_SERVICE_INFO: //服务信息
  350. {
  351. return OnTCPNetworkMainServiceInfo(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  352. }
  353. case MDM_CS_USER_COLLECT: //用户命令
  354. {
  355. return OnTCPNetworkMainUserCollect(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  356. }
  357. case MDM_CS_REMOTE_SERVICE: //远程服务
  358. {
  359. return OnTCPNetworkMainRemoteService(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  360. }
  361. case MDM_CS_MANAGER_SERVICE: //管理服务
  362. {
  363. return OnTCPNetworkMainManagerService(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  364. }
  365. //case MDM_CS_ANDROID_SERVICE: //机器服务
  366. //{
  367. // return OnTCPNetworkMainAndroidService(Command.wSubCmdID, pData, wDataSize, dwSocketID);
  368. //}
  369. default: break;
  370. }
  371. return false;
  372. }
  373. //关闭事件 ---会话Socket断开
  374. bool CAttemperEngineSink::OnEventTCPNetworkShut(DWORD dwClientAddr, DWORD dwActiveTime, DWORD dwSocketID)
  375. {
  376. //获取信息
  377. WORD wBindIndex = LOWORD(dwSocketID);
  378. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  379. //游戏服务 ---GameServer断开
  380. if (pBindParameter->ServiceKind == ServiceKind_Game)
  381. {
  382. //变量定义
  383. WORD wBindIndexTemp = LOWORD(dwSocketID);
  384. //汇总处理
  385. if (wBindIndexTemp == m_wCollectItem)
  386. {
  387. //设置变量
  388. m_wCollectItem = INVALID_WORD;
  389. //汇总切换
  390. if (m_WaitCollectItemArray.GetCount() > 0)
  391. {
  392. //提取变量
  393. INT_PTR nWaitCount = m_WaitCollectItemArray.GetCount();
  394. m_wCollectItem = m_WaitCollectItemArray[nWaitCount - 1];
  395. //删除数组
  396. m_WaitCollectItemArray.RemoveAt(nWaitCount - 1);
  397. //发送消息
  398. DWORD dwSocketIDTemp = (m_pBindParameter + m_wCollectItem)->dwSocketID;
  399. m_pITCPNetworkEngine->SendData(dwSocketIDTemp, MDM_CS_USER_COLLECT, SUB_CS_S_COLLECT_REQUEST);
  400. }
  401. }
  402. else
  403. {
  404. //删除等待
  405. for (INT_PTR i = 0; i < m_WaitCollectItemArray.GetCount(); i++)
  406. {
  407. if (wBindIndexTemp == m_WaitCollectItemArray[i])
  408. {
  409. m_WaitCollectItemArray.RemoveAt(i);
  410. break;
  411. }
  412. }
  413. }
  414. //变量定义
  415. CMD_CS_S_ServerRemove ServerRemove;
  416. ZeroMemory(&ServerRemove, sizeof(ServerRemove));
  417. //删除通知
  418. ServerRemove.wServerID = pBindParameter->wServiceID;
  419. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_REMOVE, &ServerRemove, sizeof(ServerRemove), 0L);
  420. //注销房间
  421. m_GlobalInfoManager.DeleteServerItem(pBindParameter->wServiceID);
  422. HTREEITEM hTemp;
  423. if (m_ServiceIDMap.Lookup(pBindParameter->wServiceID, hTemp))
  424. {
  425. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  426. if (p)
  427. {
  428. p->ServiceTree.DeleteItem(hTemp);
  429. }
  430. m_ServiceIDMap.RemoveKey(pBindParameter->wServiceID);
  431. }
  432. POSITION Position = NULL;
  433. CTraceService::TraceString(TEXT("GameServer被动断开断开,当前的GameServer列表:"), TraceLevel_Normal);
  434. do
  435. {
  436. //获取对象
  437. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position);
  438. if (pGlobalServerItem != NULL)
  439. {
  440. CString str;
  441. str.Format(TEXT("[%d] %s : %d"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.szServerAddr, pGlobalServerItem->m_GameServer.wServerPort);
  442. CTraceService::TraceString(str, TraceLevel_Normal);
  443. }
  444. } while (Position != NULL);
  445. }
  446. else if (pBindParameter->ServiceKind == ServiceKind_Plaza) //广场服务 ---LogonServer断开
  447. {
  448. //变量定义
  449. //WORD wBindIndex = LOWORD(dwSocketID);
  450. //tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  451. //提示消息
  452. CString cstr = L"";
  453. cstr.Format(L"关闭事件 ---会话Socket断开 pBindParameter->ServiceKind LogonServer断开:%d", pBindParameter->wServiceID);
  454. CTraceService::TraceString(cstr, TraceLevel_Normal);
  455. //注销房间
  456. m_GlobalInfoManager.DeletePlazaItem(pBindParameter->wServiceID);
  457. HTREEITEM hTemp;
  458. if (m_LoginServiceIDMap.Lookup(pBindParameter->wServiceID, hTemp))
  459. {
  460. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  461. if (p)
  462. {
  463. p->bbb.DeleteItem(hTemp);
  464. }
  465. //提示消息
  466. CString cstrTemp = L"";
  467. cstrTemp.Format(L"关闭事件 m_LoginServiceIDMap删除key:%d", pBindParameter->wServiceID);
  468. CTraceService::TraceString(cstrTemp, TraceLevel_Warning);
  469. ///---add by yd 201-8-4
  470. m_LoginServiceIDMap.RemoveKey(pBindParameter->wServiceID);
  471. }
  472. }
  473. //清除信息
  474. ZeroMemory(pBindParameter, sizeof(tagBindParameter));
  475. return false;
  476. }
  477. //数据库事件
  478. bool CAttemperEngineSink::OnEventDataBase(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
  479. {
  480. return false;
  481. }
  482. //关闭事件
  483. bool CAttemperEngineSink::OnEventTCPSocketShut(WORD wServiceID, BYTE cbShutReason)
  484. {
  485. return false;
  486. }
  487. //连接事件
  488. bool CAttemperEngineSink::OnEventTCPSocketLink(WORD wServiceID, INT nErrorCode)
  489. {
  490. return false;
  491. }
  492. //读取事件
  493. bool CAttemperEngineSink::OnEventTCPSocketRead(WORD wServiceID, TCP_Command Command, VOID * pData, WORD wDataSize)
  494. {
  495. return true;
  496. }
  497. //注册服务
  498. bool CAttemperEngineSink::OnTCPNetworkMainRegister(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  499. {
  500. switch (wSubCmdID)
  501. {
  502. case SUB_CS_C_REGISTER_PLAZA: //注册登陆服务器
  503. {
  504. //效验数据
  505. ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterPlaza));
  506. if (wDataSize != sizeof(CMD_CS_C_RegisterPlaza)) return false;
  507. //消息定义
  508. CMD_CS_C_RegisterPlaza * pRegisterPlaza = (CMD_CS_C_RegisterPlaza *)pData;
  509. //有效判断
  510. if ((pRegisterPlaza->szServerName[0] == 0) || (pRegisterPlaza->szServerAddr[0] == 0))
  511. {
  512. //变量定义
  513. CMD_CS_S_RegisterFailure RegisterFailure;
  514. ZeroMemory(&RegisterFailure, sizeof(RegisterFailure));
  515. //设置变量
  516. RegisterFailure.lErrorCode = 0L;
  517. lstrcpyn(RegisterFailure.szDescribeString, TEXT("服务器注册失败,“服务地址”与“服务器名”不合法!"), CountArray(RegisterFailure.szDescribeString));
  518. //发送消息
  519. WORD wStringSize = CountStringBuffer(RegisterFailure.szDescribeString);
  520. WORD wSendSize = sizeof(RegisterFailure) - sizeof(RegisterFailure.szDescribeString) + wStringSize;
  521. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_REGISTER, SUB_CS_S_REGISTER_FAILURE, &RegisterFailure, wSendSize);
  522. //中断网络
  523. m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
  524. return true;
  525. }
  526. //设置绑定
  527. WORD wBindIndex = LOWORD(dwSocketID);
  528. (m_pBindParameter + wBindIndex)->wServiceID = pRegisterPlaza->wServerID;
  529. (m_pBindParameter + wBindIndex)->ServiceKind = ServiceKind_Plaza;
  530. //变量定义
  531. tagGamePlaza GamePlaza;
  532. ZeroMemory(&GamePlaza, sizeof(GamePlaza));
  533. //构造数据
  534. GamePlaza.wPlazaID = pRegisterPlaza->wServerID;//wBindIndex;
  535. lstrcpyn(GamePlaza.szServerName, pRegisterPlaza->szServerName, CountArray(GamePlaza.szServerName));
  536. lstrcpyn(GamePlaza.szServerAddr, pRegisterPlaza->szServerAddr, CountArray(GamePlaza.szServerAddr));
  537. ///[---add by yd 初始化当前时间
  538. GamePlaza.wServerID = pRegisterPlaza->wServerID;
  539. GamePlaza.dwLiveTime = GetTickCount();///(DWORD)time(NULL);
  540. ///---]
  541. //注册房间
  542. m_GlobalInfoManager.ActivePlazaItem(wBindIndex, GamePlaza);
  543. HTREEITEM hTemp;
  544. if (m_LoginServiceIDMap.Lookup(GamePlaza.wPlazaID/*(m_pBindParameter + wBindIndex)->wServiceID*/, hTemp))
  545. {
  546. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  547. if (p)
  548. {
  549. p->bbb.DeleteItem(hTemp);
  550. }
  551. //提示消息
  552. CString cstr = L"";
  553. cstr.Format(L"m_LoginServiceIDMap能找到:%d,hTemp存在先删除了,再加入", GamePlaza.wPlazaID);
  554. CTraceService::TraceString(cstr, TraceLevel_Warning);
  555. CString csIpPort;
  556. csIpPort.Format(L"%s:%s 编号[%d]", CString(pRegisterPlaza->szServerAddr), pRegisterPlaza->szServerName, GamePlaza.wPlazaID/* (m_pBindParameter + wBindIndex)->wServiceID*/);
  557. HTREEITEM aa = p->bbb.InsertItem(csIpPort, 1, 1, p->hbbRoot, TVI_LAST);
  558. p->bbb.SetItemData(aa, 0);
  559. m_LoginServiceIDMap[GamePlaza.wPlazaID/*(m_pBindParameter + wBindIndex)->wServiceID*/] = aa;
  560. }
  561. else
  562. {
  563. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  564. if (p)
  565. {
  566. CString csIpPort;
  567. csIpPort.Format(L"%s:%s 编号[%d]", CString(pRegisterPlaza->szServerAddr), CString(pRegisterPlaza->szServerName), GamePlaza.wPlazaID/*(m_pBindParameter + wBindIndex)->wServiceID*/);
  568. HTREEITEM aa = p->bbb.InsertItem(csIpPort, 1, 1, p->hbbRoot, TVI_LAST);
  569. p->bbb.SetItemData(aa, 0);
  570. m_LoginServiceIDMap[GamePlaza.wPlazaID/*(m_pBindParameter + wBindIndex)->wServiceID*/] = aa;
  571. }
  572. }
  573. POSITION Position = NULL;
  574. CTraceService::TraceString(TEXT("一个登陆服务器加入,当前的登陆服务器列表:"), TraceLevel_Normal);
  575. do
  576. {
  577. //获取对象
  578. CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.EnumPlazaItem(Position);
  579. if (pGlobalServerItem != NULL)
  580. {
  581. CString str;
  582. str.Format(TEXT("[%s] %s : %d"), pGlobalServerItem->m_GamePlaza.szServerName, pGlobalServerItem->m_GamePlaza.szServerAddr, pGlobalServerItem->m_GamePlaza.wPlazaID);
  583. CTraceService::TraceString(str, TraceLevel_Normal);
  584. }
  585. } while (Position != NULL);
  586. //发送列表
  587. SendServerListItem(dwSocketID);
  588. SendMatchListItem(dwSocketID);
  589. //群发设置
  590. m_pITCPNetworkEngine->AllowBatchSend(dwSocketID, true, 0L);
  591. return true;
  592. }
  593. case SUB_CS_C_REGISTER_SERVER: //注册游戏中心服务器
  594. {
  595. //效验数据
  596. ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterServer));
  597. if (wDataSize != sizeof(CMD_CS_C_RegisterServer)) return false;
  598. //消息定义
  599. CMD_CS_C_RegisterServer * pRegisterServer = (CMD_CS_C_RegisterServer *)pData;
  600. //查找房间
  601. if (m_GlobalInfoManager.SearchServerItem(pRegisterServer->wServerID) != NULL)
  602. {
  603. //存在的话先注销旧的
  604. //变量定义
  605. CMD_CS_S_ServerRemove ServerRemove;
  606. ZeroMemory(&ServerRemove, sizeof(ServerRemove));
  607. //删除通知
  608. ServerRemove.wServerID = pRegisterServer->wServerID;
  609. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_REMOVE, &ServerRemove, sizeof(ServerRemove), 0L);
  610. //注销房间
  611. m_GlobalInfoManager.DeleteServerItem(pRegisterServer->wServerID);
  612. ////变量定义
  613. //CMD_CS_S_RegisterFailure RegisterFailure;
  614. //ZeroMemory(&RegisterFailure, sizeof(RegisterFailure));
  615. ////设置变量
  616. //RegisterFailure.lErrorCode = 0L;
  617. //lstrcpyn(RegisterFailure.szDescribeString, TEXT("已经存在相同标识的游戏房间服务,房间服务注册失败"), CountArray(RegisterFailure.szDescribeString));
  618. ////发送消息
  619. //WORD wStringSize = CountStringBuffer(RegisterFailure.szDescribeString);
  620. //WORD wSendSize = sizeof(RegisterFailure) - sizeof(RegisterFailure.szDescribeString) + wStringSize;
  621. //m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_REGISTER, SUB_CS_S_REGISTER_FAILURE, &RegisterFailure, wSendSize);
  622. ////中断网络
  623. //m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
  624. //return true;
  625. }
  626. //设置绑定
  627. WORD wBindIndex = LOWORD(dwSocketID);
  628. (m_pBindParameter + wBindIndex)->ServiceKind = ServiceKind_Game;
  629. (m_pBindParameter + wBindIndex)->wServiceID = pRegisterServer->wServerID;
  630. //变量定义
  631. tagGameServer GameServer;
  632. ZeroMemory(&GameServer, sizeof(GameServer));
  633. //构造数据
  634. GameServer.wKindID = pRegisterServer->wKindID;
  635. GameServer.wNodeID = pRegisterServer->wNodeID;
  636. GameServer.wSortID = pRegisterServer->wSortID;
  637. GameServer.wServerID = pRegisterServer->wServerID;
  638. GameServer.wServerKind = pRegisterServer->wServerKind;
  639. GameServer.wServerType = pRegisterServer->wServerType;
  640. GameServer.wServerPort = pRegisterServer->wServerPort;
  641. GameServer.lCellScore = pRegisterServer->lCellScore;
  642. GameServer.lEnterScore = pRegisterServer->lEnterScore;
  643. GameServer.dwServerRule = pRegisterServer->dwServerRule;
  644. GameServer.dwOnLineCount = pRegisterServer->dwOnLineCount;
  645. GameServer.dwFullCount = pRegisterServer->dwFullCount;
  646. GameServer.wTableFullCount = pRegisterServer->dwFullTable;
  647. GameServer.wServerLevel = pRegisterServer->wServerLevel;
  648. GameServer.bService = pRegisterServer->bService;
  649. GameServer.dwLiveTime = (DWORD)time(NULL);
  650. lstrcpyn(GameServer.szServerName, pRegisterServer->szServerName, CountArray(GameServer.szServerName));
  651. lstrcpyn(GameServer.szServerAddr, pRegisterServer->szServerAddr, CountArray(GameServer.szServerAddr));
  652. TCHAR szClientAddr[16] = TEXT("");
  653. BYTE * pClientAddr = (BYTE *)&(m_pBindParameter + wBindIndex)->dwClientAddr;
  654. _sntprintf(szClientAddr, CountArray(szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]);
  655. //注册房间
  656. m_GlobalInfoManager.ActiveServerItem(wBindIndex, GameServer);
  657. HTREEITEM hTemp;
  658. if (m_ServiceIDMap.Lookup(pRegisterServer->wServerID, hTemp))
  659. {
  660. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  661. if (p)
  662. {
  663. p->ServiceTree.DeleteItem(hTemp);
  664. }
  665. CString csIpPort;
  666. csIpPort.Format(L"%s:%d level->%d stat->%s:%d", GameServer.szServerAddr, GameServer.wServerPort, GameServer.wServerLevel, GameServer.bService == 1 ? _T("run") : (GameServer.bService == 0 ? _T("stop") : _T("by ddos")), GameServer.bService);
  667. HTREEITEM aa = p->ServiceTree.InsertItem(csIpPort, 1, 1, p->hRoot, TVI_LAST);
  668. p->ServiceTree.SetItemData(aa, GameServer.wServerID);
  669. m_ServiceIDMap[pRegisterServer->wServerID] = aa;
  670. }
  671. else
  672. {
  673. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  674. if (p)
  675. {
  676. CString csIpPort;
  677. csIpPort.Format(L"%s:%d level->%d stat->%s:%d", GameServer.szServerAddr, GameServer.wServerPort, GameServer.wServerLevel, GameServer.bService == 1 ? _T("run") : (GameServer.bService == 0 ? _T("stop") : _T("by ddos")), GameServer.bService);
  678. HTREEITEM aa = p->ServiceTree.InsertItem(csIpPort, 1, 1, p->hRoot, TVI_LAST);
  679. p->ServiceTree.SetItemData(aa, GameServer.wServerID);
  680. m_ServiceIDMap[pRegisterServer->wServerID] = aa;
  681. }
  682. }
  683. //群发房间
  684. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INSERT, &GameServer, sizeof(GameServer), 0L);
  685. //发送列表
  686. SendServerListItem(dwSocketID);
  687. SendMatchListItem(dwSocketID);
  688. //发送所有私人房间列表
  689. SendPrivateListItem(dwSocketID);
  690. //群发设置
  691. m_pITCPNetworkEngine->AllowBatchSend(dwSocketID, true, 0L);
  692. //汇总通知
  693. if (m_wCollectItem == INVALID_WORD)
  694. {
  695. m_wCollectItem = wBindIndex;
  696. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_USER_COLLECT, SUB_CS_S_COLLECT_REQUEST);
  697. }
  698. else m_WaitCollectItemArray.Add(wBindIndex);
  699. POSITION Position = NULL;
  700. CString csTest;
  701. csTest.Format(L"GameServer加入[%s][%d]", szClientAddr, (m_pBindParameter + wBindIndex)->wServiceID);
  702. CTraceService::TraceString(csTest, TraceLevel_Normal);
  703. do
  704. {
  705. //获取对象
  706. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position);
  707. if (pGlobalServerItem != NULL)
  708. {
  709. CString str;
  710. str.Format(TEXT("[%d] %s : %d"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.szServerAddr, pGlobalServerItem->m_GameServer.wServerPort);
  711. CTraceService::TraceString(str, TraceLevel_Normal);
  712. }
  713. } while (Position != NULL);
  714. return true;
  715. }
  716. case SUB_CS_C_REGISTER_MATCH: //注册比赛
  717. {
  718. //效验数据
  719. ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterMatch));
  720. if (wDataSize != sizeof(CMD_CS_C_RegisterMatch)) return false;
  721. //消息定义
  722. CMD_CS_C_RegisterMatch * pRegisterMatch = (CMD_CS_C_RegisterMatch *)pData;
  723. //查找房间
  724. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pRegisterMatch->wServerID);
  725. if (pGlobalServerItem == NULL) return true;
  726. //变量定义
  727. tagGameMatch GameMatch;
  728. ZeroMemory(&GameMatch, sizeof(GameMatch));
  729. //构造数据
  730. GameMatch.wServerID = pRegisterMatch->wServerID;
  731. GameMatch.dwMatchID = pRegisterMatch->dwMatchID;
  732. GameMatch.dwMatchNO = pRegisterMatch->dwMatchNO;
  733. GameMatch.cbMatchType = pRegisterMatch->cbMatchType;
  734. GameMatch.lMatchFee = pRegisterMatch->lMatchFee;
  735. GameMatch.cbMatchFeeType = pRegisterMatch->cbMatchFeeType;
  736. GameMatch.cbMemberOrder = pRegisterMatch->cbMemberOrder;
  737. GameMatch.wRewardCount = pRegisterMatch->wRewardCount;
  738. GameMatch.MatchEndTime = pRegisterMatch->MatchEndTime;
  739. GameMatch.MatchStartTime = pRegisterMatch->MatchStartTime;
  740. GameMatch.wStartUserCount = pRegisterMatch->wStartUserCount;
  741. GameMatch.wMatchPlayCount = pRegisterMatch->wMatchPlayCount;
  742. lstrcpyn(GameMatch.szMatchName, pRegisterMatch->szMatchName, CountArray(GameMatch.szMatchName));
  743. //拷贝数据
  744. CopyMemory(&pGlobalServerItem->m_GameMatch, &GameMatch, sizeof(pGlobalServerItem->m_GameMatch));
  745. //群发房间
  746. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_MATCH_INSERT, &GameMatch, sizeof(GameMatch), 0L);
  747. return true;
  748. }
  749. default: break;
  750. }
  751. return false;
  752. }
  753. //服务状态
  754. bool CAttemperEngineSink::OnTCPNetworkMainServiceInfo(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  755. {
  756. switch (wSubCmdID)
  757. {
  758. case SUB_CS_UPDATASERVICE: //服务器状态更新
  759. {
  760. ASSERT(wDataSize == sizeof(JN_GR_SERVICESTAT));
  761. if (wDataSize != sizeof(JN_GR_SERVICESTAT)) return false;
  762. //消息定义
  763. JN_GR_SERVICESTAT * pServerOnLine = (JN_GR_SERVICESTAT *)pData;
  764. //获取参数
  765. WORD wBindIndex = LOWORD(dwSocketID);
  766. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  767. //连接效验
  768. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  769. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  770. //查找房间
  771. WORD wServerID = pBindParameter->wServiceID;
  772. ASSERT(wServerID == pServerOnLine->dwServerID);
  773. if (wServerID != pServerOnLine->dwServerID) return false;
  774. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(wServerID);
  775. //设置人数
  776. if (pGlobalServerItem != NULL)
  777. {
  778. //变量定义
  779. JN_GR_SERVICESTAT ServerOnLine;
  780. ZeroMemory(&ServerOnLine, sizeof(ServerOnLine));
  781. ServerOnLine.bService = pServerOnLine->bService;
  782. ServerOnLine.dwServerID = pServerOnLine->dwServerID;
  783. CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd;
  784. //查找房间
  785. //修改房间信息
  786. pGlobalServerItem->m_GameServer.bService = pServerOnLine->bService;
  787. if (p)
  788. {
  789. HTREEITEM startitem = p->ServiceTree.GetChildItem(p->hRoot);
  790. while (startitem)
  791. {
  792. CString strTemp = p->ServiceTree.GetItemText(startitem);
  793. DWORD dData = p->ServiceTree.GetItemData(startitem);
  794. if (dData == pServerOnLine->dwServerID)
  795. {
  796. if (pGlobalServerItem->m_GameServer.bService > 0)
  797. {
  798. //正常服务状态
  799. p->ServiceTree.SetItemImage(startitem, 1, 1);
  800. break;
  801. }
  802. else if (pGlobalServerItem->m_GameServer.bService == 0)
  803. {
  804. //主动不提供服务状态
  805. p->ServiceTree.SetItemImage(startitem, 2, 2);
  806. break;
  807. }
  808. else
  809. {
  810. //被攻击无法服务状态
  811. p->ServiceTree.SetItemImage(startitem, 3, 3);
  812. break;
  813. }
  814. }
  815. startitem = p->ServiceTree.GetNextSiblingItem(startitem);
  816. }
  817. }
  818. //发送通知
  819. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_STAT, &ServerOnLine, sizeof(ServerOnLine), 0L);
  820. }
  821. return true;
  822. }
  823. case SUB_CS_C_SERVER_ONLINE: //房间人数
  824. {
  825. //效验数据
  826. ASSERT(wDataSize == sizeof(CMD_CS_C_ServerOnLine));
  827. if (wDataSize != sizeof(CMD_CS_C_ServerOnLine)) return false;
  828. //消息定义
  829. CMD_CS_C_ServerOnLine * pServerOnLine = (CMD_CS_C_ServerOnLine *)pData;
  830. //获取参数
  831. WORD wBindIndex = LOWORD(dwSocketID);
  832. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  833. //连接效验
  834. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  835. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  836. //查找房间
  837. WORD wServerID = pBindParameter->wServiceID;
  838. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(wServerID);
  839. //设置人数
  840. if (pGlobalServerItem != NULL)
  841. {
  842. //变量定义
  843. CMD_CS_S_ServerOnLine ServerOnLine;
  844. ZeroMemory(&ServerOnLine, sizeof(ServerOnLine));
  845. //设置变量
  846. pGlobalServerItem->m_GameServer.dwOnLineCount = pServerOnLine->dwOnLineCount;
  847. //设置变量
  848. ServerOnLine.wServerID = wServerID;
  849. ServerOnLine.dwOnLineCount = pServerOnLine->dwOnLineCount;
  850. ServerOnLine.wTableOnlineCount = pServerOnLine->wTableOnlineCount;//在线桌子数
  851. ServerOnLine.wTableFullCount = pServerOnLine->wTableFullCount; //满员桌子数
  852. pGlobalServerItem->m_GameServer.wTableOnlineCount = pServerOnLine->wTableOnlineCount;
  853. pGlobalServerItem->m_GameServer.dwOnLineCount = pServerOnLine->dwOnLineCount;
  854. pGlobalServerItem->m_GameServer.wTableFullCount = pServerOnLine->wTableFullCount;
  855. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_ONLINE, &ServerOnLine, sizeof(ServerOnLine), 0L);
  856. //存储信息到redis
  857. std::vector<std::pair<std::string, std::string>> field_val;
  858. field_val.push_back({ "wServerID", string_format("%d",ServerOnLine.wServerID) });
  859. field_val.push_back({ "dwOnLineCount", string_format("%d",ServerOnLine.dwOnLineCount) });
  860. field_val.push_back({ "wTableOnlineCount", string_format("%d",ServerOnLine.wTableOnlineCount) });
  861. field_val.push_back({ "wTableFullCount", string_format("%d",ServerOnLine.wTableFullCount) });
  862. m_RedisClient->GetRedisClient()->hmset(string_format("Server_Info:%d", ServerOnLine.wServerID), field_val, [](const cpp_redis::reply& reply) {
  863. std::cout << "hmset: " << reply << std::endl;
  864. });
  865. m_RedisClient->GetRedisClient()->sync_commit();
  866. }
  867. return true;
  868. }
  869. case SUB_CS_C_SERVER_ONLINE_ACK: //房间人数应答 ///---是GameServer实例个数
  870. {
  871. //效验数据
  872. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerAllOnLine));
  873. if (wDataSize != sizeof(CMD_CS_S_ServerAllOnLine)) return false;
  874. //消息定义
  875. CMD_CS_S_ServerAllOnLine * pServerOnLine = (CMD_CS_S_ServerAllOnLine *)pData;
  876. DWORD dNum = m_GlobalInfoManager.GetServerItemCount();
  877. if (dNum != pServerOnLine->dwServerNum)
  878. {
  879. m_pITCPNetworkEngine->CloseSocket(dwSocketID);
  880. //主动断开通讯,清理工作交给超时检测。
  881. }
  882. return true;
  883. }
  884. case SUB_CS_C_SERVER_MODIFY: //房间修改
  885. {
  886. //效验数据
  887. ASSERT(wDataSize == sizeof(CMD_CS_C_ServerModify));
  888. if (wDataSize != sizeof(CMD_CS_C_ServerModify)) return false;
  889. //消息定义
  890. CMD_CS_C_ServerModify * pServerModify = (CMD_CS_C_ServerModify *)pData;
  891. //获取参数
  892. WORD wBindIndex = LOWORD(dwSocketID);
  893. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  894. //连接效验
  895. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  896. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  897. //查找房间
  898. ASSERT(m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID) != NULL);
  899. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID);
  900. //房间修改
  901. if (pGlobalServerItem != NULL)
  902. {
  903. //设置变量
  904. pGlobalServerItem->m_GameServer.wSortID = pServerModify->wSortID;
  905. pGlobalServerItem->m_GameServer.wKindID = pServerModify->wKindID;
  906. pGlobalServerItem->m_GameServer.wNodeID = pServerModify->wNodeID;
  907. pGlobalServerItem->m_GameServer.wServerPort = pServerModify->wServerPort;
  908. pGlobalServerItem->m_GameServer.dwOnLineCount = pServerModify->dwOnLineCount;
  909. pGlobalServerItem->m_GameServer.wTableFullCount = pServerModify->wTableFullCount; //满员桌子数
  910. pGlobalServerItem->m_GameServer.wTableOnlineCount = pServerModify->wTableOnlineCount; //在线桌子数
  911. pGlobalServerItem->m_GameServer.dwFullCount = pServerModify->dwFullCount;
  912. lstrcpyn(pGlobalServerItem->m_GameServer.szServerName, pServerModify->szServerName, CountArray(pGlobalServerItem->m_GameServer.szServerName));
  913. lstrcpyn(pGlobalServerItem->m_GameServer.szServerAddr, pServerModify->szServerAddr, CountArray(pGlobalServerItem->m_GameServer.szServerAddr));
  914. //变量定义
  915. CMD_CS_S_ServerModify ServerModify;
  916. ZeroMemory(&ServerModify, sizeof(ServerModify));
  917. //设置变量
  918. ServerModify.wKindID = pServerModify->wKindID;
  919. ServerModify.wSortID = pServerModify->wSortID;
  920. ServerModify.wNodeID = pServerModify->wNodeID;
  921. ServerModify.wServerID = pBindParameter->wServiceID;
  922. ServerModify.wServerPort = pServerModify->wServerPort;
  923. ServerModify.dwFullCount = pServerModify->dwFullCount;
  924. lstrcpyn(ServerModify.szServerAddr, pServerModify->szServerAddr, CountArray(ServerModify.szServerAddr));
  925. lstrcpyn(ServerModify.szServerName, pServerModify->szServerName, CountArray(ServerModify.szServerName));
  926. //发送通知
  927. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_MODIFY, &ServerModify, sizeof(ServerModify), 0L);
  928. }
  929. return true;
  930. }
  931. case SUB_CS_C_SERVER_JULI:
  932. {
  933. //发送通知
  934. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_C_SERVER_JULI_ACK, pData, wDataSize, 0L);
  935. return true;
  936. }
  937. default: break;
  938. }
  939. return false;
  940. }
  941. //登录失败
  942. bool CAttemperEngineSink::SendLogonFailure(LPCTSTR pszString, LONG lErrorCode, DWORD dwSocketID)
  943. {
  944. CTraceService::TraceString(TEXT("登录失败 SendLogonFailure"), TraceLevel_Exception);
  945. //变量定义
  946. CMD_GR_LogonFailureEx LogonFailure;
  947. ZeroMemory(&LogonFailure, sizeof(LogonFailure));
  948. //构造数据
  949. LogonFailure.lErrorCode = lErrorCode;
  950. lstrcpyn(LogonFailure.szDescribeString, pszString, CountArray(LogonFailure.szDescribeString));
  951. //数据属性
  952. WORD wDataSize = CountStringBuffer(LogonFailure.szDescribeString);
  953. WORD wHeadSize = sizeof(LogonFailure) - sizeof(LogonFailure.szDescribeString);
  954. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_LOGON, SUB_GR_LOGON_FAILURE, &LogonFailure, wHeadSize + wDataSize);
  955. return true;
  956. }
  957. //用户处理
  958. bool CAttemperEngineSink::OnTCPNetworkMainUserCollect(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  959. {
  960. switch (wSubCmdID)
  961. {
  962. case SUB_CS_DISSOLVEROOM:
  963. {
  964. //群主解散俱乐部房间
  965. ASSERT(wDataSize == sizeof(DWORD));
  966. if (wDataSize != sizeof(DWORD)) return false;
  967. //DWORD *dwRoomID = (DWORD *)pData;
  968. //广播给特定服务器
  969. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  970. while (Position != NULL)
  971. {
  972. CGlobalServerItem *pCGlobalServerItem = NULL;
  973. WORD wID = 0;
  974. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  975. if (pCGlobalServerItem != NULL)
  976. {
  977. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_DISSOLVEROOM, pData, wDataSize);
  978. }
  979. }
  980. return true;
  981. }
  982. case SUB_CS_ChangServer:
  983. {
  984. //向协调申请换服务器开房
  985. ASSERT(wDataSize == sizeof(CMD_GR_ClubAction2_XT));
  986. if (wDataSize != sizeof(CMD_GR_ClubAction2_XT)) return false;
  987. CMD_GR_ClubAction2_XT *pClubAction = (CMD_GR_ClubAction2_XT *)pData;
  988. //广播给特定服务器
  989. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  990. while (Position != NULL)
  991. {
  992. CGlobalServerItem *pCGlobalServerItem = NULL;
  993. WORD wID = 0;
  994. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  995. if (pCGlobalServerItem != NULL && pCGlobalServerItem->GetServerID() == pClubAction->dwServerID)
  996. {
  997. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_ChangServer, pData, wDataSize);
  998. }
  999. }
  1000. return true;
  1001. }
  1002. case SUB_CS_C_USER_SendMessage:
  1003. {
  1004. ASSERT(wDataSize == sizeof(CMD_GR_Club_NotifyEX_ACK));
  1005. if (wDataSize != sizeof(CMD_GR_Club_NotifyEX_ACK)) return false;
  1006. CMD_GR_Club_NotifyEX_ACK* pInfo = (CMD_GR_Club_NotifyEX_ACK*)pData;
  1007. //获取参数
  1008. WORD wBindIndex = LOWORD(dwSocketID);
  1009. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1010. //连接效验
  1011. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1012. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1013. //向所有服务器广播该信息
  1014. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1015. while (Position != NULL)
  1016. {
  1017. CGlobalServerItem *pCGlobalServerItem = NULL;
  1018. WORD wID = 0;
  1019. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1020. if (pCGlobalServerItem != NULL)
  1021. {
  1022. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_SendMessage, pInfo, sizeof(CMD_GR_Club_NotifyEX_ACK));
  1023. }
  1024. }
  1025. return true;
  1026. }
  1027. case SUB_CS_C_GET_ROOMID: ///---??用户创建房间时返回的房间ID(由协调统一生成唯一ID)
  1028. {
  1029. //获取参数
  1030. WORD wBindIndex = LOWORD(dwSocketID);
  1031. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1032. //连接效验
  1033. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1034. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1035. DWORD dRet = GetRandom::GetRandomValue();
  1036. CMD_CS_UserSitDownEx * pUserSitDown = (CMD_CS_UserSitDownEx *)pData;
  1037. pUserSitDown->RoomID = dRet;
  1038. SendDataToGame(pBindParameter->wServiceID, MDM_CS_USER_COLLECT, SUB_CS_C_GET_ROOMID, pData, wDataSize);
  1039. return true;
  1040. }
  1041. case SUB_CS_UPDATAOWNBEANS_UNLOCK:
  1042. {
  1043. ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResultEX));
  1044. if (wDataSize != sizeof(DBO_GR_UserReduceResultEX)) return false;
  1045. DBO_GR_UserReduceResultEX* pInfo = (DBO_GR_UserReduceResultEX*)pData;
  1046. CGlobalUserItem *pCGlobalUserItem = m_GlobalInfoManager.SearchUserItemByUserID(pInfo->dwUserID);
  1047. if (pCGlobalUserItem && pCGlobalUserItem->m_ServerID!=0)
  1048. {
  1049. int i = 0;
  1050. CGlobalServerItem * p = pCGlobalUserItem->EnumServerItem(i);
  1051. while (p)
  1052. {
  1053. if (p->GetServerID() == pCGlobalUserItem->m_ServerID)
  1054. {
  1055. //向最近登录的服务器,发送。
  1056. SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_UNLOCK, pData, wDataSize);
  1057. break;
  1058. }
  1059. i++;
  1060. p = pCGlobalUserItem->EnumServerItem(i);
  1061. }
  1062. }
  1063. return true;
  1064. }
  1065. case SUB_CS_UPDATAOWNBEANS_LOCK:
  1066. {
  1067. ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResultEX));
  1068. if (wDataSize != sizeof(DBO_GR_UserReduceResultEX)) return false;
  1069. DBO_GR_UserReduceResultEX* pInfo = (DBO_GR_UserReduceResultEX*)pData;
  1070. CGlobalUserItem *pCGlobalUserItem = m_GlobalInfoManager.SearchUserItemByUserID(pInfo->dwUserID);
  1071. if (pCGlobalUserItem && pCGlobalUserItem->m_ServerID != 0)
  1072. {
  1073. int i = 0;
  1074. CGlobalServerItem * p = pCGlobalUserItem->EnumServerItem(i);
  1075. while (p)
  1076. {
  1077. if (p->GetServerID() == pCGlobalUserItem->m_ServerID)
  1078. {
  1079. //向最近登录的服务器,发送。
  1080. SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_LOCK, pData, wDataSize);
  1081. break;
  1082. }
  1083. i++;
  1084. p = pCGlobalUserItem->EnumServerItem(i);
  1085. }
  1086. }
  1087. return true;
  1088. }
  1089. case SUB_CS_C_USER_ENTER: //用户进入
  1090. {
  1091. //效验数据
  1092. ASSERT(wDataSize == sizeof(CMD_CS_C_UserEnter));
  1093. if (wDataSize != sizeof(CMD_CS_C_UserEnter)) return false;
  1094. //消息处理
  1095. CMD_CS_C_UserEnter * pUserEnter = (CMD_CS_C_UserEnter *)pData;
  1096. //pUserEnter->szNickName[CountArray(pUserEnter->szNickName) - 1] = 0;
  1097. //获取参数
  1098. WORD wBindIndex = LOWORD(dwSocketID);
  1099. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1100. //连接效验
  1101. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1102. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1103. //变量定义
  1104. tagGlobalUserInfo GlobalUserInfo;
  1105. ZeroMemory(&GlobalUserInfo, sizeof(GlobalUserInfo));
  1106. //设置变量
  1107. GlobalUserInfo.dwUserID = pUserEnter->dwUserID;
  1108. GlobalUserInfo.dwGameID = pUserEnter->dwGameID;
  1109. //lstrcpyn(GlobalUserInfo.szNickName, pUserEnter->szNickName, CountArray(GlobalUserInfo.szNickName));
  1110. //辅助信息
  1111. GlobalUserInfo.cbGender = pUserEnter->cbGender;
  1112. GlobalUserInfo.cbMemberOrder = pUserEnter->cbMemberOrder;
  1113. GlobalUserInfo.cbMasterOrder = pUserEnter->cbMasterOrder;
  1114. //激活用户
  1115. int result = m_GlobalInfoManager.ActiveUserItem(GlobalUserInfo, pBindParameter->wServiceID);
  1116. if (result > 0)
  1117. {
  1118. //遍历节点
  1119. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1120. while (Position != NULL)
  1121. {
  1122. CGlobalServerItem *pCGlobalServerItem = NULL;
  1123. WORD wID = 0;
  1124. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1125. if (pCGlobalServerItem != NULL && pCGlobalServerItem->GetServerID() == result)
  1126. {
  1127. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_DisCONN, &(GlobalUserInfo.dwUserID), sizeof(DWORD));
  1128. }
  1129. }
  1130. }
  1131. //返回这个用户的创建房间列表
  1132. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  1133. JN_GR_RoomListGroup jnTemp;
  1134. ZeroMemory(&jnTemp, sizeof(jnTemp));
  1135. if (pCMapRoomList->Lookup(GlobalUserInfo.dwUserID, jnTemp))
  1136. {
  1137. JN_GR_RoomListGroupSend jnTempSend;
  1138. ZeroMemory(&jnTempSend, sizeof(jnTempSend));
  1139. jnTempSend.Num = jnTemp.Num;
  1140. for (int i = 0; i < (jnTemp.Num > 30 ? 30 : jnTemp.Num); i++)
  1141. {
  1142. CopyMemory(&(jnTempSend.jgrDate[i]), &(jnTemp.jgrDate[i]), sizeof(JN_GR_RoomList));
  1143. jnTempSend.jgrDate[i].tmp1 = jnTemp.jgrDate[i].bRoomCreatePay;
  1144. jnTempSend.jgrDate[i].tmp2 = jnTemp.jgrDate[i].tmp1;
  1145. jnTempSend.jgrDate[i].tmp3 = jnTemp.jgrDate[i].tmp2;
  1146. }
  1147. //拥有
  1148. if (jnTempSend.Num > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNROOMLIST, &jnTempSend, sizeof(JN_GR_RoomListGroupSend));
  1149. }
  1150. //向所有服务器广播该玩家上线信息
  1151. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1152. while (Position != NULL)
  1153. {
  1154. CGlobalServerItem *pCGlobalServerItem = NULL;
  1155. WORD wID = 0;
  1156. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1157. if (pCGlobalServerItem != NULL)
  1158. {
  1159. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_ONLINE, pUserEnter, sizeof(CMD_CS_C_UserEnter));
  1160. }
  1161. }
  1162. return true;
  1163. }
  1164. case SUB_CS_C_USER_LEAVE: //用户离开
  1165. {
  1166. //效验数据
  1167. ASSERT(wDataSize == sizeof(CMD_CS_C_UserLeave));
  1168. if (wDataSize != sizeof(CMD_CS_C_UserLeave)) return false;
  1169. //消息处理
  1170. CMD_CS_C_UserLeave * pUserLeave = (CMD_CS_C_UserLeave *)pData;
  1171. //获取参数
  1172. WORD wBindIndex = LOWORD(dwSocketID);
  1173. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1174. //连接效验
  1175. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1176. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1177. //删除用户
  1178. m_GlobalInfoManager.DeleteUserItem(pUserLeave->dwUserID, pBindParameter->wServiceID);
  1179. //向所有服务器广播该玩家离线信息
  1180. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1181. while (Position != NULL)
  1182. {
  1183. CGlobalServerItem *pCGlobalServerItem = NULL;
  1184. WORD wID = 0;
  1185. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1186. if (pCGlobalServerItem != NULL)
  1187. {
  1188. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_OFFLINE, pUserLeave, sizeof(CMD_CS_C_UserLeave));
  1189. }
  1190. }
  1191. return true;
  1192. }
  1193. case SUB_CS_C_USER_FINISH: //用户完成
  1194. {
  1195. //获取参数
  1196. WORD wBindIndex = LOWORD(dwSocketID);
  1197. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1198. //连接效验
  1199. ASSERT((m_wCollectItem == wBindIndex) && (pBindParameter->ServiceKind == ServiceKind_Game));
  1200. if ((m_wCollectItem != wBindIndex) || (pBindParameter->ServiceKind != ServiceKind_Game)) return false;
  1201. //设置变量
  1202. m_wCollectItem = INVALID_WORD;
  1203. //汇总切换
  1204. if (m_WaitCollectItemArray.GetCount() > 0)
  1205. {
  1206. //切换汇总
  1207. INT_PTR nWaitCount = m_WaitCollectItemArray.GetCount();
  1208. m_wCollectItem = m_WaitCollectItemArray[nWaitCount - 1];
  1209. //删除数组
  1210. m_WaitCollectItemArray.RemoveAt(nWaitCount - 1);
  1211. //发送消息
  1212. DWORD dwSocketIDTemp = (m_pBindParameter + m_wCollectItem)->dwSocketID;
  1213. m_pITCPNetworkEngine->SendData(dwSocketIDTemp, MDM_CS_USER_COLLECT, SUB_CS_S_COLLECT_REQUEST);
  1214. }
  1215. return true;
  1216. }
  1217. case SUB_CS_C_USER_SERVER: ///---用户是否在游戏牌桌上的状态汇总
  1218. {
  1219. //效验数据
  1220. ASSERT(wDataSize == sizeof(CMD_CS_C_UserServer));
  1221. if (wDataSize != sizeof(CMD_CS_C_UserServer)) return false;
  1222. //消息处理
  1223. CMD_CS_C_UserServer * pUserServer = (CMD_CS_C_UserServer *)pData;
  1224. //获取参数
  1225. WORD wBindIndex = LOWORD(dwSocketID);
  1226. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1227. //连接效验
  1228. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1229. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1230. //变量定义
  1231. CMD_CS_S_ServerUserInfo ServerUserInfo;
  1232. ZeroMemory(&ServerUserInfo, sizeof(ServerUserInfo));
  1233. ServerUserInfo.dwUserID = pUserServer->dwUserID;
  1234. if (pUserServer->cbFlag == 0)
  1235. {
  1236. ServerUserInfo.wServerID = 0;
  1237. }
  1238. else
  1239. {
  1240. ServerUserInfo.wServerID = pBindParameter->wServiceID;
  1241. }
  1242. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_USER_INFO, &ServerUserInfo, sizeof(ServerUserInfo), 0L);
  1243. return true;
  1244. }
  1245. case SUB_CS_UPDATAOWNROOM: //私人桌子更新
  1246. {
  1247. //效验数据
  1248. ASSERT(wDataSize == sizeof(JN_GR_RoomListBig));
  1249. if (wDataSize != sizeof(JN_GR_RoomListBig)) return false;
  1250. //消息处理
  1251. JN_GR_RoomListBig * pUserServer = (JN_GR_RoomListBig *)pData;
  1252. int b = 0;
  1253. if (pUserServer->dwInsert_UpData_Del == 0) ///---添加更新删除 0 , 1, 2
  1254. {
  1255. CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom();
  1256. JN_GR_RoomListBig tempA;
  1257. ZeroMemory(&tempA, sizeof(tempA));
  1258. tempA.InsertTime = GetTickCount();
  1259. pUserServer->InsertTime = GetTickCount();
  1260. if (!pCMapRoomListA->Lookup(pUserServer->dwRoomNumber, tempA))
  1261. {
  1262. //CString csTest;
  1263. //csTest.Format(_T("私有房间数目:%d,房间编号%d->新增"), pCMapRoomListA->GetSize() + 1, pUserServer->dwRoomNumber);
  1264. //CTraceService::TraceString(csTest, TraceLevel_Normal);
  1265. tempA = *pUserServer;
  1266. pCMapRoomListA->SetAt(pUserServer->dwRoomNumber, tempA);
  1267. //更新私有房间广播
  1268. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1269. while (Position != NULL)
  1270. {
  1271. CGlobalServerItem *pCGlobalServerItem = NULL;
  1272. WORD wID = 0;
  1273. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1274. if (pCGlobalServerItem != NULL)
  1275. {
  1276. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize);
  1277. }
  1278. }
  1279. }
  1280. //添加
  1281. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  1282. JN_GR_RoomListGroup temp;
  1283. ZeroMemory(&temp, sizeof(temp));
  1284. pCMapRoomList->Lookup(pUserServer->dwUserID, temp);
  1285. if (temp.Num < 10)
  1286. {
  1287. bool bFind = false;
  1288. for (size_t i = 0; i <( temp.Num < 10 ? temp.Num: 10); i++)
  1289. {
  1290. if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber)
  1291. {
  1292. bFind = true;
  1293. b = i;
  1294. break;
  1295. }
  1296. }
  1297. if (bFind)
  1298. {
  1299. temp.jgrDate[b] = *pUserServer;
  1300. (*pCMapRoomList)[pUserServer->dwUserID] = temp;
  1301. pUserServer->dwInsert_UpData_Del = 1;
  1302. }
  1303. else
  1304. {
  1305. temp.jgrDate[temp.Num] = *pUserServer;
  1306. temp.Num++;
  1307. (*pCMapRoomList)[pUserServer->dwUserID] = temp;
  1308. }
  1309. }
  1310. }
  1311. else if (pUserServer->dwInsert_UpData_Del == 1)
  1312. {
  1313. //更新
  1314. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  1315. JN_GR_RoomListGroup temp;
  1316. ZeroMemory(&temp, sizeof(temp));
  1317. pCMapRoomList->Lookup(pUserServer->dwUserID, temp);
  1318. for (size_t i = 0; i < (temp.Num < 10 ? temp.Num : 10); i++)
  1319. {
  1320. if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber)
  1321. {
  1322. temp.jgrDate[i] = *pUserServer;
  1323. (*pCMapRoomList)[pUserServer->dwUserID] = temp;
  1324. break;
  1325. }
  1326. }
  1327. //更新私有房间广播
  1328. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1329. while (Position != NULL)
  1330. {
  1331. CGlobalServerItem *pCGlobalServerItem = NULL;
  1332. WORD wID = 0;
  1333. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1334. if (pCGlobalServerItem != NULL)
  1335. {
  1336. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize);
  1337. }
  1338. }
  1339. }
  1340. else
  1341. {
  1342. CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom();
  1343. JN_GR_RoomListBig tempA;
  1344. ZeroMemory(&tempA, sizeof(tempA));
  1345. if (pCMapRoomListA->Lookup(pUserServer->dwRoomNumber, tempA))
  1346. {
  1347. pCMapRoomListA->RemoveKey(pUserServer->dwRoomNumber);
  1348. //CString csTest;
  1349. //csTest.Format(_T("私有房间数目:%d,房间编号%d->销毁"), pCMapRoomListA->GetSize(), pUserServer->dwRoomNumber);
  1350. //CTraceService::TraceString(csTest, TraceLevel_Normal);
  1351. //更新私有房间广播
  1352. /*DWORD dPrivateRoom = 0;
  1353. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1354. while (Position != NULL)
  1355. {
  1356. CGlobalServerItem *pCGlobalServerItem = NULL;
  1357. WORD wID = 0;
  1358. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1359. if (pCGlobalServerItem != NULL)
  1360. {
  1361. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize);
  1362. }
  1363. }*/
  1364. }
  1365. //无条件广播
  1366. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1367. while (Position != NULL)
  1368. {
  1369. CGlobalServerItem *pCGlobalServerItem = NULL;
  1370. WORD wID = 0;
  1371. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1372. if (pCGlobalServerItem != NULL)
  1373. {
  1374. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize);
  1375. }
  1376. }
  1377. //删除
  1378. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  1379. JN_GR_RoomListGroup temp;
  1380. ZeroMemory(&temp, sizeof(temp));
  1381. pCMapRoomList->Lookup(pUserServer->dwUserID, temp);
  1382. for (size_t i = 0; i < (temp.Num < 10 ? temp.Num : 10); i++)
  1383. {
  1384. if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber)
  1385. {
  1386. temp.jgrDate[i] = temp.jgrDate[(temp.Num < 10 ? temp.Num : 10) - 1];
  1387. ZeroMemory(&(temp.jgrDate[temp.Num - 1]), sizeof(temp.jgrDate[temp.Num - 1]));
  1388. if (temp.Num > 0) temp.Num--;
  1389. if (temp.Num == 0)
  1390. {
  1391. //清除这个人的信息
  1392. pCMapRoomList->RemoveKey(pUserServer->dwUserID);
  1393. }
  1394. else
  1395. {
  1396. (*pCMapRoomList)[pUserServer->dwUserID] = temp;
  1397. }
  1398. break;
  1399. }
  1400. }
  1401. }
  1402. CGlobalUserItem * pUser = m_GlobalInfoManager.SearchUserItemByUserID(pUserServer->dwUserID);
  1403. if (pUser)
  1404. {
  1405. int a = 0;
  1406. CGlobalServerItem * p = pUser->EnumServerItem(a);
  1407. while (p)
  1408. {
  1409. if (p->GetServerID() == pUser->m_ServerID)
  1410. {
  1411. //最近登录的服务器,发送。
  1412. SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNROOM, pData, wDataSize);
  1413. break;
  1414. }
  1415. a++;
  1416. p = pUser->EnumServerItem(a);
  1417. }
  1418. }
  1419. return true;
  1420. }
  1421. default: break;
  1422. }
  1423. return false;
  1424. }
  1425. //远程服务
  1426. bool CAttemperEngineSink::OnTCPNetworkMainRemoteService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1427. {
  1428. switch (wSubCmdID)
  1429. {
  1430. case SUB_CS_C_SEARCH_CORRESPOND: //协调查找
  1431. {
  1432. //效验参数
  1433. ASSERT(wDataSize == sizeof(CMD_CS_C_SearchCorrespond));
  1434. if (wDataSize != sizeof(CMD_CS_C_SearchCorrespond)) return false;
  1435. //处理消息
  1436. CMD_CS_C_SearchCorrespond * pSearchCorrespond = (CMD_CS_C_SearchCorrespond *)pData;
  1437. pSearchCorrespond->szNickName[CountArray(pSearchCorrespond->szNickName) - 1] = 0;
  1438. //变量定义
  1439. CMD_CS_S_SearchCorrespond SearchCorrespond;
  1440. ZeroMemory(&SearchCorrespond, sizeof(SearchCorrespond));
  1441. //结果用户
  1442. CGlobalUserItem * ResultUserItem[2];
  1443. ZeroMemory(ResultUserItem, sizeof(ResultUserItem));
  1444. //设置变量
  1445. SearchCorrespond.dwSocketID = pSearchCorrespond->dwSocketID;
  1446. SearchCorrespond.dwClientAddr = pSearchCorrespond->dwClientAddr;
  1447. //查找用户
  1448. if (pSearchCorrespond->dwGameID != 0L)
  1449. {
  1450. ResultUserItem[0] = m_GlobalInfoManager.SearchUserItemByGameID(pSearchCorrespond->dwGameID);
  1451. }
  1452. //查找用户
  1453. //if (pSearchCorrespond->szNickName[0] != 0)
  1454. //{
  1455. // _tcslwr(pSearchCorrespond->szNickName);
  1456. //ResultUserItem[1] = m_GlobalInfoManager.SearchUserItemByNickName(pSearchCorrespond->szNickName);
  1457. //}
  1458. //设置结果
  1459. for (BYTE i = 0; i < CountArray(ResultUserItem); i++)
  1460. {
  1461. if (ResultUserItem[i] != NULL)
  1462. {
  1463. //变量定义
  1464. WORD wServerIndex = 0;
  1465. //查找房间
  1466. do
  1467. {
  1468. //查找房间
  1469. CGlobalServerItem * pGlobalServerItem = ResultUserItem[i]->EnumServerItem(wServerIndex++);
  1470. //终止判断
  1471. if (pGlobalServerItem == NULL) break;
  1472. if (SearchCorrespond.wUserCount >= CountArray(SearchCorrespond.UserRemoteInfo)) break;
  1473. //索引定义
  1474. WORD wIndex = SearchCorrespond.wUserCount++;
  1475. //辅助信息
  1476. SearchCorrespond.UserRemoteInfo[wIndex].cbGender = ResultUserItem[i]->GetGender();
  1477. SearchCorrespond.UserRemoteInfo[wIndex].cbMemberOrder = ResultUserItem[i]->GetMemberOrder();
  1478. SearchCorrespond.UserRemoteInfo[wIndex].cbMasterOrder = ResultUserItem[i]->GetMasterOrder();
  1479. //用户信息
  1480. SearchCorrespond.UserRemoteInfo[wIndex].dwUserID = ResultUserItem[i]->GetUserID();
  1481. SearchCorrespond.UserRemoteInfo[wIndex].dwGameID = ResultUserItem[i]->GetGameID();
  1482. //lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szNickName, ResultUserItem[i]->GetNickName(), LEN_NICKNAME);
  1483. //房间信息
  1484. SearchCorrespond.UserRemoteInfo[wIndex].wKindID = pGlobalServerItem->GetKindID();
  1485. SearchCorrespond.UserRemoteInfo[wIndex].wServerID = pGlobalServerItem->GetServerID();
  1486. lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szGameServer, pGlobalServerItem->m_GameServer.szServerName, LEN_SERVER);
  1487. } while (true);
  1488. }
  1489. }
  1490. //发送数据
  1491. WORD wHeadSize = sizeof(SearchCorrespond) - sizeof(SearchCorrespond.UserRemoteInfo);
  1492. WORD wItemSize = sizeof(SearchCorrespond.UserRemoteInfo[0])*SearchCorrespond.wUserCount;
  1493. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_REMOTE_SERVICE, SUB_CS_S_SEARCH_CORRESPOND, &SearchCorrespond, wHeadSize + wItemSize);
  1494. return true;
  1495. }
  1496. default: break;
  1497. }
  1498. return false;
  1499. }
  1500. //管理服务
  1501. bool CAttemperEngineSink::OnTCPNetworkMainManagerService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1502. {
  1503. switch (wSubCmdID)
  1504. {
  1505. case SUB_CS_C_SYSTEM_MESSAGE: //系统消息
  1506. {
  1507. //发送通知
  1508. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_SYSTEM_MESSAGE, pData, wDataSize, 0L);
  1509. return true;
  1510. }
  1511. case SUB_CS_C_PROPERTY_TRUMPET: //喇叭消息
  1512. {
  1513. //发送通知
  1514. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_PROPERTY_TRUMPET, pData, wDataSize, 0L);
  1515. return true;
  1516. }
  1517. case SUB_CS_C_TELL_CORRESPOND: //服务器发来的心跳
  1518. {
  1519. //效验数据
  1520. ASSERT(wDataSize == sizeof(CMD_CS_C_TellCorr));
  1521. if (wDataSize != sizeof(CMD_CS_C_TellCorr)) return false;
  1522. //消息定义
  1523. CMD_CS_C_TellCorr * pTellCorr = (CMD_CS_C_TellCorr *)pData;
  1524. //获取对象
  1525. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pTellCorr->wServerID);
  1526. if (pGlobalServerItem != NULL)
  1527. {
  1528. pGlobalServerItem->m_GameServer.dwLiveTime = (DWORD)time(NULL);
  1529. CString str;
  1530. str.Format(TEXT("服务器%d 心跳时间[%d]"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.dwLiveTime);
  1531. CCorrespondServerDlg* pCCorrespondServerDlg = (CCorrespondServerDlg*)theApp.m_pMainWnd;
  1532. pCCorrespondServerDlg->aa.SetWindowTextW(str);;
  1533. ///CTraceService::TraceString(str, TraceLevel_Normal);
  1534. }
  1535. else
  1536. {
  1537. //为空则该服务器已经被清空。断开连接。回一个非法包
  1538. m_pITCPNetworkEngine->CloseSocket(dwSocketID);
  1539. //m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
  1540. //WORD wPacketSize = pHead->TCPInfo.wPacketSize;
  1541. //if (wPacketSize > SOCKET_TCP_BUFFER) throw TEXT("数据包超长");
  1542. //if (wPacketSize < sizeof(TCP_Head)) throw TEXT("数据包非法");
  1543. //if (m_wRecvSize < wPacketSize) break;
  1544. }
  1545. return true;
  1546. }
  1547. ///[---add by yd
  1548. case SUB_CS_C_LOGON_HEARTBEAT: // 收到登录服务器的心跳包,更新LogonServer心跳时间
  1549. {
  1550. ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterPlaza));
  1551. if (wDataSize != sizeof(CMD_CS_C_RegisterPlaza))
  1552. {
  1553. return false;
  1554. }
  1555. //消息定义
  1556. //WORD * pwServerID = (WORD *)pData;
  1557. ////获取对象
  1558. //CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItemByServerID(*pwServerID);
  1559. CMD_CS_C_RegisterPlaza * pRegisterPlaza = (CMD_CS_C_RegisterPlaza *)pData;
  1560. //变量定义
  1561. tagGamePlaza GamePlaza;
  1562. ZeroMemory(&GamePlaza, sizeof(GamePlaza));
  1563. //构造数据
  1564. //GamePlaza.wPlazaID = wBindIndex;
  1565. //lstrcpyn(GamePlaza.szServerName, pRegisterPlaza->szServerName, CountArray(GamePlaza.szServerName));
  1566. //lstrcpyn(GamePlaza.szServerAddr, pRegisterPlaza->szServerAddr, CountArray(GamePlaza.szServerAddr));
  1567. //GamePlaza.wServerID = pRegisterPlaza->wServerID;
  1568. //GamePlaza.dwLiveTime = GetTickCount();///(DWORD)time(NULL);
  1569. //m_GlobalInfoManager.ActivePlazaItem(wBindIndex, GamePlaza);
  1570. //获取对象
  1571. //CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItemByServerID(GamePlaza.wServerID);
  1572. CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItem(pRegisterPlaza->wServerID);
  1573. if (pGlobalServerItem != NULL)
  1574. {
  1575. ///---更新当前登录服务器的心跳时间
  1576. pGlobalServerItem->m_GamePlaza.dwLiveTime = GetTickCount();///(DWORD)time(NULL);
  1577. CString str;
  1578. str.Format(TEXT("***登录服务器%d 心跳时间[%d]"), pGlobalServerItem->GetPlazaServerID(), pGlobalServerItem->m_GamePlaza.dwLiveTime);
  1579. CCorrespondServerDlg* pCCorrespondServerDlg = (CCorrespondServerDlg*)theApp.m_pMainWnd;
  1580. pCCorrespondServerDlg->aa.SetWindowTextW(str);
  1581. //CTraceService::TraceString(str, TraceLevel_Normal);
  1582. ///---回一个心跳包
  1583. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_MANAGER_SERVICE, SUB_CS_C_LOGON_HEARTBEAT, pData, wDataSize);
  1584. }
  1585. else
  1586. {
  1587. ASSERT(FALSE);
  1588. CString str;
  1589. str.Format(TEXT("***未找到此登录服务器, wServerID=%d 心跳未发送"), pRegisterPlaza->wServerID);
  1590. CTraceService::TraceString(str, TraceLevel_Normal);
  1591. }
  1592. return true;
  1593. }
  1594. default: break;
  1595. ///---]
  1596. }
  1597. return false;
  1598. }
  1599. //机器服务
  1600. //bool CAttemperEngineSink::OnTCPNetworkMainAndroidService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1601. //{
  1602. // switch (wSubCmdID)
  1603. // {
  1604. // case SUB_CS_C_ADDPARAMETER: //添加参数
  1605. // {
  1606. // //参数校验
  1607. // ASSERT(sizeof(CMD_CS_C_AddParameter) == wDataSize);
  1608. // if (sizeof(CMD_CS_C_AddParameter) != wDataSize) return false;
  1609. //
  1610. // //提取数据
  1611. // CMD_CS_C_AddParameter * pAddParameter = (CMD_CS_C_AddParameter *)pData;
  1612. //
  1613. // //构造结构
  1614. // CMD_CS_S_AddParameter AddParameter;
  1615. // CopyMemory(&AddParameter.AndroidParameter, &pAddParameter->AndroidParameter, sizeof(tagAndroidParameter));
  1616. //
  1617. // //发送消息
  1618. // SendDataToGame(pAddParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_ADDPARAMETER, &AddParameter, sizeof(AddParameter));
  1619. //
  1620. // return true;
  1621. // }
  1622. // case SUB_CS_C_MODIFYPARAMETER: //修改参数
  1623. // {
  1624. // //参数校验
  1625. // ASSERT(sizeof(CMD_CS_C_ModifyParameter) == wDataSize);
  1626. // if (sizeof(CMD_CS_C_ModifyParameter) != wDataSize) return false;
  1627. //
  1628. // //提取数据
  1629. // CMD_CS_C_ModifyParameter * pModifyParameter = (CMD_CS_C_ModifyParameter *)pData;
  1630. //
  1631. // //构造结构
  1632. // CMD_CS_S_ModifyParameter ModifyParameter;
  1633. // CopyMemory(&ModifyParameter.AndroidParameter, &pModifyParameter->AndroidParameter, sizeof(tagAndroidParameter));
  1634. //
  1635. // //发送通知
  1636. // SendDataToGame(pModifyParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_MODIFYPARAMETER, &ModifyParameter, sizeof(ModifyParameter));
  1637. //
  1638. // return true;
  1639. // }
  1640. // case SUB_CS_C_DELETEPARAMETER: //删除参数
  1641. // {
  1642. // //参数校验
  1643. // ASSERT(sizeof(CMD_CS_C_DeleteParameter) == wDataSize);
  1644. // if (sizeof(CMD_CS_C_DeleteParameter) != wDataSize) return false;
  1645. //
  1646. // //提取数据
  1647. // CMD_CS_C_DeleteParameter * pDeleteParameter = (CMD_CS_C_DeleteParameter *)pData;
  1648. //
  1649. // //构造结构
  1650. // CMD_CS_S_DeleteParameter DeleteParameter;
  1651. // DeleteParameter.dwBatchID = pDeleteParameter->dwBatchID;
  1652. //
  1653. // //发送通知
  1654. // SendDataToGame(pDeleteParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_DELETEPARAMETER, &DeleteParameter, sizeof(DeleteParameter));
  1655. //
  1656. // return true;
  1657. // }
  1658. // default: break;
  1659. // }
  1660. //
  1661. // return false;
  1662. //}
  1663. //发送私人房间列表总会
  1664. bool CAttemperEngineSink::SendPrivateListItem(DWORD dwSocketID)
  1665. {
  1666. //变量定义
  1667. CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom();
  1668. ///---JN_GR_RoomListBig tempA;
  1669. ///---ZeroMemory(&tempA, sizeof(tempA));
  1670. POSITION Position = pCMapRoomListA->GetStartPosition();
  1671. while (Position != NULL)
  1672. {
  1673. JN_GR_RoomListBig Temp;
  1674. ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig));
  1675. DWORD dwRoomNumber = 0;
  1676. pCMapRoomListA->GetNextAssoc(Position, dwRoomNumber, Temp);
  1677. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, &Temp, sizeof(JN_GR_RoomListBig));
  1678. }
  1679. return true;
  1680. }
  1681. //发送列表
  1682. bool CAttemperEngineSink::SendServerListItem(DWORD dwSocketID)
  1683. {
  1684. //变量定义
  1685. WORD wPacketSize = 0L;
  1686. POSITION Position = NULL;
  1687. BYTE cbBuffer[SOCKET_TCP_PACKET];
  1688. //发送信息
  1689. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INFO);
  1690. //收集数据
  1691. do
  1692. {
  1693. //发送数据
  1694. if ((wPacketSize + sizeof(tagGameServer)) > sizeof(cbBuffer))
  1695. {
  1696. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INSERT, cbBuffer, wPacketSize);
  1697. wPacketSize = 0;
  1698. }
  1699. //获取对象
  1700. tagGameServer * pGameServer = (tagGameServer *)(cbBuffer + wPacketSize);
  1701. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position);
  1702. //设置数据
  1703. if (pGlobalServerItem != NULL)
  1704. {
  1705. wPacketSize += sizeof(tagGameServer);
  1706. CopyMemory(pGameServer, &pGlobalServerItem->m_GameServer, sizeof(tagGameServer));
  1707. }
  1708. } while (Position != NULL);
  1709. //发送数据
  1710. if (wPacketSize > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INSERT, cbBuffer, wPacketSize);
  1711. //发送完成
  1712. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_FINISH);
  1713. return true;
  1714. }
  1715. //发送列表
  1716. bool CAttemperEngineSink::SendMatchListItem(DWORD dwSocketID)
  1717. {
  1718. //变量定义
  1719. WORD wPacketSize = 0L;
  1720. POSITION Position = NULL;
  1721. BYTE cbBuffer[SOCKET_TCP_PACKET];
  1722. //收集数据
  1723. do
  1724. {
  1725. //发送数据
  1726. if ((wPacketSize + sizeof(tagGameServer)) > sizeof(cbBuffer))
  1727. {
  1728. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_MATCH_INSERT, cbBuffer, wPacketSize);
  1729. wPacketSize = 0;
  1730. }
  1731. //获取对象
  1732. tagGameMatch * pGameMatch = (tagGameMatch *)(cbBuffer + wPacketSize);
  1733. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position);
  1734. //设置数据
  1735. if (pGlobalServerItem != NULL && pGlobalServerItem->IsMatchServer())
  1736. {
  1737. wPacketSize += sizeof(tagGameMatch);
  1738. CopyMemory(pGameMatch, &pGlobalServerItem->m_GameMatch, sizeof(tagGameMatch));
  1739. }
  1740. } while (Position != NULL);
  1741. //发送数据
  1742. if (wPacketSize > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_MATCH_INSERT, cbBuffer, wPacketSize);
  1743. return true;
  1744. }
  1745. //房间发送
  1746. bool CAttemperEngineSink::SendDataToGame(WORD wServerID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
  1747. {
  1748. //查找房间
  1749. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(wServerID);
  1750. if (pGlobalServerItem == NULL) return false;
  1751. //获取参数
  1752. WORD wBindIndex = pGlobalServerItem->GetIndex();
  1753. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1754. //发送数据
  1755. DWORD dwSocketID = pBindParameter->dwSocketID;
  1756. m_pITCPNetworkEngine->SendData(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize);
  1757. return true;
  1758. }
  1759. //////////////////////////////////////////////////////////////////////////////////