诸暨麻将添加redis
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

2092 satır
68 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. }
  857. return true;
  858. }
  859. case SUB_CS_C_SERVER_ONLINE_ACK: //房间人数应答 ///---是GameServer实例个数
  860. {
  861. //效验数据
  862. ASSERT(wDataSize == sizeof(CMD_CS_S_ServerAllOnLine));
  863. if (wDataSize != sizeof(CMD_CS_S_ServerAllOnLine)) return false;
  864. //消息定义
  865. CMD_CS_S_ServerAllOnLine * pServerOnLine = (CMD_CS_S_ServerAllOnLine *)pData;
  866. DWORD dNum = m_GlobalInfoManager.GetServerItemCount();
  867. if (dNum != pServerOnLine->dwServerNum)
  868. {
  869. m_pITCPNetworkEngine->CloseSocket(dwSocketID);
  870. //主动断开通讯,清理工作交给超时检测。
  871. }
  872. return true;
  873. }
  874. case SUB_CS_C_SERVER_MODIFY: //房间修改
  875. {
  876. //效验数据
  877. ASSERT(wDataSize == sizeof(CMD_CS_C_ServerModify));
  878. if (wDataSize != sizeof(CMD_CS_C_ServerModify)) return false;
  879. //消息定义
  880. CMD_CS_C_ServerModify * pServerModify = (CMD_CS_C_ServerModify *)pData;
  881. //获取参数
  882. WORD wBindIndex = LOWORD(dwSocketID);
  883. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  884. //连接效验
  885. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  886. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  887. //查找房间
  888. ASSERT(m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID) != NULL);
  889. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID);
  890. //房间修改
  891. if (pGlobalServerItem != NULL)
  892. {
  893. //设置变量
  894. pGlobalServerItem->m_GameServer.wSortID = pServerModify->wSortID;
  895. pGlobalServerItem->m_GameServer.wKindID = pServerModify->wKindID;
  896. pGlobalServerItem->m_GameServer.wNodeID = pServerModify->wNodeID;
  897. pGlobalServerItem->m_GameServer.wServerPort = pServerModify->wServerPort;
  898. pGlobalServerItem->m_GameServer.dwOnLineCount = pServerModify->dwOnLineCount;
  899. pGlobalServerItem->m_GameServer.wTableFullCount = pServerModify->wTableFullCount; //满员桌子数
  900. pGlobalServerItem->m_GameServer.wTableOnlineCount = pServerModify->wTableOnlineCount; //在线桌子数
  901. pGlobalServerItem->m_GameServer.dwFullCount = pServerModify->dwFullCount;
  902. lstrcpyn(pGlobalServerItem->m_GameServer.szServerName, pServerModify->szServerName, CountArray(pGlobalServerItem->m_GameServer.szServerName));
  903. lstrcpyn(pGlobalServerItem->m_GameServer.szServerAddr, pServerModify->szServerAddr, CountArray(pGlobalServerItem->m_GameServer.szServerAddr));
  904. //变量定义
  905. CMD_CS_S_ServerModify ServerModify;
  906. ZeroMemory(&ServerModify, sizeof(ServerModify));
  907. //设置变量
  908. ServerModify.wKindID = pServerModify->wKindID;
  909. ServerModify.wSortID = pServerModify->wSortID;
  910. ServerModify.wNodeID = pServerModify->wNodeID;
  911. ServerModify.wServerID = pBindParameter->wServiceID;
  912. ServerModify.wServerPort = pServerModify->wServerPort;
  913. ServerModify.dwFullCount = pServerModify->dwFullCount;
  914. lstrcpyn(ServerModify.szServerAddr, pServerModify->szServerAddr, CountArray(ServerModify.szServerAddr));
  915. lstrcpyn(ServerModify.szServerName, pServerModify->szServerName, CountArray(ServerModify.szServerName));
  916. //发送通知
  917. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_MODIFY, &ServerModify, sizeof(ServerModify), 0L);
  918. }
  919. return true;
  920. }
  921. case SUB_CS_C_SERVER_JULI:
  922. {
  923. //发送通知
  924. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_C_SERVER_JULI_ACK, pData, wDataSize, 0L);
  925. return true;
  926. }
  927. default: break;
  928. }
  929. return false;
  930. }
  931. //登录失败
  932. bool CAttemperEngineSink::SendLogonFailure(LPCTSTR pszString, LONG lErrorCode, DWORD dwSocketID)
  933. {
  934. CTraceService::TraceString(TEXT("登录失败 SendLogonFailure"), TraceLevel_Exception);
  935. //变量定义
  936. CMD_GR_LogonFailureEx LogonFailure;
  937. ZeroMemory(&LogonFailure, sizeof(LogonFailure));
  938. //构造数据
  939. LogonFailure.lErrorCode = lErrorCode;
  940. lstrcpyn(LogonFailure.szDescribeString, pszString, CountArray(LogonFailure.szDescribeString));
  941. //数据属性
  942. WORD wDataSize = CountStringBuffer(LogonFailure.szDescribeString);
  943. WORD wHeadSize = sizeof(LogonFailure) - sizeof(LogonFailure.szDescribeString);
  944. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_LOGON, SUB_GR_LOGON_FAILURE, &LogonFailure, wHeadSize + wDataSize);
  945. return true;
  946. }
  947. //用户处理
  948. bool CAttemperEngineSink::OnTCPNetworkMainUserCollect(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  949. {
  950. switch (wSubCmdID)
  951. {
  952. case SUB_CS_DISSOLVEROOM:
  953. {
  954. //群主解散俱乐部房间
  955. ASSERT(wDataSize == sizeof(DWORD));
  956. if (wDataSize != sizeof(DWORD)) return false;
  957. //DWORD *dwRoomID = (DWORD *)pData;
  958. //广播给特定服务器
  959. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  960. while (Position != NULL)
  961. {
  962. CGlobalServerItem *pCGlobalServerItem = NULL;
  963. WORD wID = 0;
  964. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  965. if (pCGlobalServerItem != NULL)
  966. {
  967. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_DISSOLVEROOM, pData, wDataSize);
  968. }
  969. }
  970. return true;
  971. }
  972. case SUB_CS_ChangServer:
  973. {
  974. //向协调申请换服务器开房
  975. ASSERT(wDataSize == sizeof(CMD_GR_ClubAction2_XT));
  976. if (wDataSize != sizeof(CMD_GR_ClubAction2_XT)) return false;
  977. CMD_GR_ClubAction2_XT *pClubAction = (CMD_GR_ClubAction2_XT *)pData;
  978. //广播给特定服务器
  979. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  980. while (Position != NULL)
  981. {
  982. CGlobalServerItem *pCGlobalServerItem = NULL;
  983. WORD wID = 0;
  984. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  985. if (pCGlobalServerItem != NULL && pCGlobalServerItem->GetServerID() == pClubAction->dwServerID)
  986. {
  987. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_ChangServer, pData, wDataSize);
  988. }
  989. }
  990. return true;
  991. }
  992. case SUB_CS_C_USER_SendMessage:
  993. {
  994. ASSERT(wDataSize == sizeof(CMD_GR_Club_NotifyEX_ACK));
  995. if (wDataSize != sizeof(CMD_GR_Club_NotifyEX_ACK)) return false;
  996. CMD_GR_Club_NotifyEX_ACK* pInfo = (CMD_GR_Club_NotifyEX_ACK*)pData;
  997. //获取参数
  998. WORD wBindIndex = LOWORD(dwSocketID);
  999. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1000. //连接效验
  1001. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1002. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1003. //向所有服务器广播该信息
  1004. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1005. while (Position != NULL)
  1006. {
  1007. CGlobalServerItem *pCGlobalServerItem = NULL;
  1008. WORD wID = 0;
  1009. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1010. if (pCGlobalServerItem != NULL)
  1011. {
  1012. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_SendMessage, pInfo, sizeof(CMD_GR_Club_NotifyEX_ACK));
  1013. }
  1014. }
  1015. return true;
  1016. }
  1017. case SUB_CS_C_GET_ROOMID: ///---??用户创建房间时返回的房间ID(由协调统一生成唯一ID)
  1018. {
  1019. //获取参数
  1020. WORD wBindIndex = LOWORD(dwSocketID);
  1021. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1022. //连接效验
  1023. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1024. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1025. DWORD dRet = GetRandom::GetRandomValue();
  1026. CMD_CS_UserSitDownEx * pUserSitDown = (CMD_CS_UserSitDownEx *)pData;
  1027. pUserSitDown->RoomID = dRet;
  1028. SendDataToGame(pBindParameter->wServiceID, MDM_CS_USER_COLLECT, SUB_CS_C_GET_ROOMID, pData, wDataSize);
  1029. return true;
  1030. }
  1031. case SUB_CS_UPDATAOWNBEANS_UNLOCK:
  1032. {
  1033. ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResultEX));
  1034. if (wDataSize != sizeof(DBO_GR_UserReduceResultEX)) return false;
  1035. DBO_GR_UserReduceResultEX* pInfo = (DBO_GR_UserReduceResultEX*)pData;
  1036. CGlobalUserItem *pCGlobalUserItem = m_GlobalInfoManager.SearchUserItemByUserID(pInfo->dwUserID);
  1037. if (pCGlobalUserItem && pCGlobalUserItem->m_ServerID!=0)
  1038. {
  1039. int i = 0;
  1040. CGlobalServerItem * p = pCGlobalUserItem->EnumServerItem(i);
  1041. while (p)
  1042. {
  1043. if (p->GetServerID() == pCGlobalUserItem->m_ServerID)
  1044. {
  1045. //向最近登录的服务器,发送。
  1046. SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_UNLOCK, pData, wDataSize);
  1047. break;
  1048. }
  1049. i++;
  1050. p = pCGlobalUserItem->EnumServerItem(i);
  1051. }
  1052. }
  1053. return true;
  1054. }
  1055. case SUB_CS_UPDATAOWNBEANS_LOCK:
  1056. {
  1057. ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResultEX));
  1058. if (wDataSize != sizeof(DBO_GR_UserReduceResultEX)) return false;
  1059. DBO_GR_UserReduceResultEX* pInfo = (DBO_GR_UserReduceResultEX*)pData;
  1060. CGlobalUserItem *pCGlobalUserItem = m_GlobalInfoManager.SearchUserItemByUserID(pInfo->dwUserID);
  1061. if (pCGlobalUserItem && pCGlobalUserItem->m_ServerID != 0)
  1062. {
  1063. int i = 0;
  1064. CGlobalServerItem * p = pCGlobalUserItem->EnumServerItem(i);
  1065. while (p)
  1066. {
  1067. if (p->GetServerID() == pCGlobalUserItem->m_ServerID)
  1068. {
  1069. //向最近登录的服务器,发送。
  1070. SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_LOCK, pData, wDataSize);
  1071. break;
  1072. }
  1073. i++;
  1074. p = pCGlobalUserItem->EnumServerItem(i);
  1075. }
  1076. }
  1077. return true;
  1078. }
  1079. case SUB_CS_C_USER_ENTER: //用户进入
  1080. {
  1081. //效验数据
  1082. ASSERT(wDataSize == sizeof(CMD_CS_C_UserEnter));
  1083. if (wDataSize != sizeof(CMD_CS_C_UserEnter)) return false;
  1084. //消息处理
  1085. CMD_CS_C_UserEnter * pUserEnter = (CMD_CS_C_UserEnter *)pData;
  1086. //pUserEnter->szNickName[CountArray(pUserEnter->szNickName) - 1] = 0;
  1087. //获取参数
  1088. WORD wBindIndex = LOWORD(dwSocketID);
  1089. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1090. //连接效验
  1091. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1092. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1093. //变量定义
  1094. tagGlobalUserInfo GlobalUserInfo;
  1095. ZeroMemory(&GlobalUserInfo, sizeof(GlobalUserInfo));
  1096. //设置变量
  1097. GlobalUserInfo.dwUserID = pUserEnter->dwUserID;
  1098. GlobalUserInfo.dwGameID = pUserEnter->dwGameID;
  1099. //lstrcpyn(GlobalUserInfo.szNickName, pUserEnter->szNickName, CountArray(GlobalUserInfo.szNickName));
  1100. //辅助信息
  1101. GlobalUserInfo.cbGender = pUserEnter->cbGender;
  1102. GlobalUserInfo.cbMemberOrder = pUserEnter->cbMemberOrder;
  1103. GlobalUserInfo.cbMasterOrder = pUserEnter->cbMasterOrder;
  1104. //激活用户
  1105. int result = m_GlobalInfoManager.ActiveUserItem(GlobalUserInfo, pBindParameter->wServiceID);
  1106. if (result > 0)
  1107. {
  1108. //遍历节点
  1109. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1110. while (Position != NULL)
  1111. {
  1112. CGlobalServerItem *pCGlobalServerItem = NULL;
  1113. WORD wID = 0;
  1114. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1115. if (pCGlobalServerItem != NULL && pCGlobalServerItem->GetServerID() == result)
  1116. {
  1117. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_DisCONN, &(GlobalUserInfo.dwUserID), sizeof(DWORD));
  1118. }
  1119. }
  1120. }
  1121. //返回这个用户的创建房间列表
  1122. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  1123. JN_GR_RoomListGroup jnTemp;
  1124. ZeroMemory(&jnTemp, sizeof(jnTemp));
  1125. if (pCMapRoomList->Lookup(GlobalUserInfo.dwUserID, jnTemp))
  1126. {
  1127. JN_GR_RoomListGroupSend jnTempSend;
  1128. ZeroMemory(&jnTempSend, sizeof(jnTempSend));
  1129. jnTempSend.Num = jnTemp.Num;
  1130. for (int i = 0; i < (jnTemp.Num > 30 ? 30 : jnTemp.Num); i++)
  1131. {
  1132. CopyMemory(&(jnTempSend.jgrDate[i]), &(jnTemp.jgrDate[i]), sizeof(JN_GR_RoomList));
  1133. jnTempSend.jgrDate[i].tmp1 = jnTemp.jgrDate[i].bRoomCreatePay;
  1134. jnTempSend.jgrDate[i].tmp2 = jnTemp.jgrDate[i].tmp1;
  1135. jnTempSend.jgrDate[i].tmp3 = jnTemp.jgrDate[i].tmp2;
  1136. }
  1137. //拥有
  1138. if (jnTempSend.Num > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNROOMLIST, &jnTempSend, sizeof(JN_GR_RoomListGroupSend));
  1139. }
  1140. //向所有服务器广播该玩家上线信息
  1141. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1142. while (Position != NULL)
  1143. {
  1144. CGlobalServerItem *pCGlobalServerItem = NULL;
  1145. WORD wID = 0;
  1146. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1147. if (pCGlobalServerItem != NULL)
  1148. {
  1149. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_ONLINE, pUserEnter, sizeof(CMD_CS_C_UserEnter));
  1150. }
  1151. }
  1152. return true;
  1153. }
  1154. case SUB_CS_C_USER_LEAVE: //用户离开
  1155. {
  1156. //效验数据
  1157. ASSERT(wDataSize == sizeof(CMD_CS_C_UserLeave));
  1158. if (wDataSize != sizeof(CMD_CS_C_UserLeave)) return false;
  1159. //消息处理
  1160. CMD_CS_C_UserLeave * pUserLeave = (CMD_CS_C_UserLeave *)pData;
  1161. //获取参数
  1162. WORD wBindIndex = LOWORD(dwSocketID);
  1163. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1164. //连接效验
  1165. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1166. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1167. //删除用户
  1168. m_GlobalInfoManager.DeleteUserItem(pUserLeave->dwUserID, pBindParameter->wServiceID);
  1169. //向所有服务器广播该玩家离线信息
  1170. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1171. while (Position != NULL)
  1172. {
  1173. CGlobalServerItem *pCGlobalServerItem = NULL;
  1174. WORD wID = 0;
  1175. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1176. if (pCGlobalServerItem != NULL)
  1177. {
  1178. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_OFFLINE, pUserLeave, sizeof(CMD_CS_C_UserLeave));
  1179. }
  1180. }
  1181. return true;
  1182. }
  1183. case SUB_CS_C_USER_FINISH: //用户完成
  1184. {
  1185. //获取参数
  1186. WORD wBindIndex = LOWORD(dwSocketID);
  1187. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1188. //连接效验
  1189. ASSERT((m_wCollectItem == wBindIndex) && (pBindParameter->ServiceKind == ServiceKind_Game));
  1190. if ((m_wCollectItem != wBindIndex) || (pBindParameter->ServiceKind != ServiceKind_Game)) return false;
  1191. //设置变量
  1192. m_wCollectItem = INVALID_WORD;
  1193. //汇总切换
  1194. if (m_WaitCollectItemArray.GetCount() > 0)
  1195. {
  1196. //切换汇总
  1197. INT_PTR nWaitCount = m_WaitCollectItemArray.GetCount();
  1198. m_wCollectItem = m_WaitCollectItemArray[nWaitCount - 1];
  1199. //删除数组
  1200. m_WaitCollectItemArray.RemoveAt(nWaitCount - 1);
  1201. //发送消息
  1202. DWORD dwSocketIDTemp = (m_pBindParameter + m_wCollectItem)->dwSocketID;
  1203. m_pITCPNetworkEngine->SendData(dwSocketIDTemp, MDM_CS_USER_COLLECT, SUB_CS_S_COLLECT_REQUEST);
  1204. }
  1205. return true;
  1206. }
  1207. case SUB_CS_C_USER_SERVER: ///---用户是否在游戏牌桌上的状态汇总
  1208. {
  1209. //效验数据
  1210. ASSERT(wDataSize == sizeof(CMD_CS_C_UserServer));
  1211. if (wDataSize != sizeof(CMD_CS_C_UserServer)) return false;
  1212. //消息处理
  1213. CMD_CS_C_UserServer * pUserServer = (CMD_CS_C_UserServer *)pData;
  1214. //获取参数
  1215. WORD wBindIndex = LOWORD(dwSocketID);
  1216. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1217. //连接效验
  1218. ASSERT(pBindParameter->ServiceKind == ServiceKind_Game);
  1219. if (pBindParameter->ServiceKind != ServiceKind_Game) return false;
  1220. //变量定义
  1221. CMD_CS_S_ServerUserInfo ServerUserInfo;
  1222. ZeroMemory(&ServerUserInfo, sizeof(ServerUserInfo));
  1223. ServerUserInfo.dwUserID = pUserServer->dwUserID;
  1224. if (pUserServer->cbFlag == 0)
  1225. {
  1226. ServerUserInfo.wServerID = 0;
  1227. }
  1228. else
  1229. {
  1230. ServerUserInfo.wServerID = pBindParameter->wServiceID;
  1231. }
  1232. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_USER_INFO, &ServerUserInfo, sizeof(ServerUserInfo), 0L);
  1233. return true;
  1234. }
  1235. case SUB_CS_UPDATAOWNROOM: //私人桌子更新
  1236. {
  1237. //效验数据
  1238. ASSERT(wDataSize == sizeof(JN_GR_RoomListBig));
  1239. if (wDataSize != sizeof(JN_GR_RoomListBig)) return false;
  1240. //消息处理
  1241. JN_GR_RoomListBig * pUserServer = (JN_GR_RoomListBig *)pData;
  1242. int b = 0;
  1243. if (pUserServer->dwInsert_UpData_Del == 0) ///---添加更新删除 0 , 1, 2
  1244. {
  1245. CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom();
  1246. JN_GR_RoomListBig tempA;
  1247. ZeroMemory(&tempA, sizeof(tempA));
  1248. tempA.InsertTime = GetTickCount();
  1249. pUserServer->InsertTime = GetTickCount();
  1250. if (!pCMapRoomListA->Lookup(pUserServer->dwRoomNumber, tempA))
  1251. {
  1252. //CString csTest;
  1253. //csTest.Format(_T("私有房间数目:%d,房间编号%d->新增"), pCMapRoomListA->GetSize() + 1, pUserServer->dwRoomNumber);
  1254. //CTraceService::TraceString(csTest, TraceLevel_Normal);
  1255. tempA = *pUserServer;
  1256. pCMapRoomListA->SetAt(pUserServer->dwRoomNumber, tempA);
  1257. //更新私有房间广播
  1258. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1259. while (Position != NULL)
  1260. {
  1261. CGlobalServerItem *pCGlobalServerItem = NULL;
  1262. WORD wID = 0;
  1263. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1264. if (pCGlobalServerItem != NULL)
  1265. {
  1266. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize);
  1267. }
  1268. }
  1269. }
  1270. //添加
  1271. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  1272. JN_GR_RoomListGroup temp;
  1273. ZeroMemory(&temp, sizeof(temp));
  1274. pCMapRoomList->Lookup(pUserServer->dwUserID, temp);
  1275. if (temp.Num < 10)
  1276. {
  1277. bool bFind = false;
  1278. for (size_t i = 0; i <( temp.Num < 10 ? temp.Num: 10); i++)
  1279. {
  1280. if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber)
  1281. {
  1282. bFind = true;
  1283. b = i;
  1284. break;
  1285. }
  1286. }
  1287. if (bFind)
  1288. {
  1289. temp.jgrDate[b] = *pUserServer;
  1290. (*pCMapRoomList)[pUserServer->dwUserID] = temp;
  1291. pUserServer->dwInsert_UpData_Del = 1;
  1292. }
  1293. else
  1294. {
  1295. temp.jgrDate[temp.Num] = *pUserServer;
  1296. temp.Num++;
  1297. (*pCMapRoomList)[pUserServer->dwUserID] = temp;
  1298. }
  1299. }
  1300. }
  1301. else if (pUserServer->dwInsert_UpData_Del == 1)
  1302. {
  1303. //更新
  1304. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  1305. JN_GR_RoomListGroup temp;
  1306. ZeroMemory(&temp, sizeof(temp));
  1307. pCMapRoomList->Lookup(pUserServer->dwUserID, temp);
  1308. for (size_t i = 0; i < (temp.Num < 10 ? temp.Num : 10); i++)
  1309. {
  1310. if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber)
  1311. {
  1312. temp.jgrDate[i] = *pUserServer;
  1313. (*pCMapRoomList)[pUserServer->dwUserID] = temp;
  1314. break;
  1315. }
  1316. }
  1317. //更新私有房间广播
  1318. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1319. while (Position != NULL)
  1320. {
  1321. CGlobalServerItem *pCGlobalServerItem = NULL;
  1322. WORD wID = 0;
  1323. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1324. if (pCGlobalServerItem != NULL)
  1325. {
  1326. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize);
  1327. }
  1328. }
  1329. }
  1330. else
  1331. {
  1332. CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom();
  1333. JN_GR_RoomListBig tempA;
  1334. ZeroMemory(&tempA, sizeof(tempA));
  1335. if (pCMapRoomListA->Lookup(pUserServer->dwRoomNumber, tempA))
  1336. {
  1337. pCMapRoomListA->RemoveKey(pUserServer->dwRoomNumber);
  1338. //CString csTest;
  1339. //csTest.Format(_T("私有房间数目:%d,房间编号%d->销毁"), pCMapRoomListA->GetSize(), pUserServer->dwRoomNumber);
  1340. //CTraceService::TraceString(csTest, TraceLevel_Normal);
  1341. //更新私有房间广播
  1342. /*DWORD dPrivateRoom = 0;
  1343. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1344. while (Position != NULL)
  1345. {
  1346. CGlobalServerItem *pCGlobalServerItem = NULL;
  1347. WORD wID = 0;
  1348. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1349. if (pCGlobalServerItem != NULL)
  1350. {
  1351. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize);
  1352. }
  1353. }*/
  1354. }
  1355. //无条件广播
  1356. POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition();
  1357. while (Position != NULL)
  1358. {
  1359. CGlobalServerItem *pCGlobalServerItem = NULL;
  1360. WORD wID = 0;
  1361. m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem);
  1362. if (pCGlobalServerItem != NULL)
  1363. {
  1364. SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize);
  1365. }
  1366. }
  1367. //删除
  1368. CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData();
  1369. JN_GR_RoomListGroup temp;
  1370. ZeroMemory(&temp, sizeof(temp));
  1371. pCMapRoomList->Lookup(pUserServer->dwUserID, temp);
  1372. for (size_t i = 0; i < (temp.Num < 10 ? temp.Num : 10); i++)
  1373. {
  1374. if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber)
  1375. {
  1376. temp.jgrDate[i] = temp.jgrDate[(temp.Num < 10 ? temp.Num : 10) - 1];
  1377. ZeroMemory(&(temp.jgrDate[temp.Num - 1]), sizeof(temp.jgrDate[temp.Num - 1]));
  1378. if (temp.Num > 0) temp.Num--;
  1379. if (temp.Num == 0)
  1380. {
  1381. //清除这个人的信息
  1382. pCMapRoomList->RemoveKey(pUserServer->dwUserID);
  1383. }
  1384. else
  1385. {
  1386. (*pCMapRoomList)[pUserServer->dwUserID] = temp;
  1387. }
  1388. break;
  1389. }
  1390. }
  1391. }
  1392. CGlobalUserItem * pUser = m_GlobalInfoManager.SearchUserItemByUserID(pUserServer->dwUserID);
  1393. if (pUser)
  1394. {
  1395. int a = 0;
  1396. CGlobalServerItem * p = pUser->EnumServerItem(a);
  1397. while (p)
  1398. {
  1399. if (p->GetServerID() == pUser->m_ServerID)
  1400. {
  1401. //最近登录的服务器,发送。
  1402. SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNROOM, pData, wDataSize);
  1403. break;
  1404. }
  1405. a++;
  1406. p = pUser->EnumServerItem(a);
  1407. }
  1408. }
  1409. return true;
  1410. }
  1411. default: break;
  1412. }
  1413. return false;
  1414. }
  1415. //远程服务
  1416. bool CAttemperEngineSink::OnTCPNetworkMainRemoteService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1417. {
  1418. switch (wSubCmdID)
  1419. {
  1420. case SUB_CS_C_SEARCH_CORRESPOND: //协调查找
  1421. {
  1422. //效验参数
  1423. ASSERT(wDataSize == sizeof(CMD_CS_C_SearchCorrespond));
  1424. if (wDataSize != sizeof(CMD_CS_C_SearchCorrespond)) return false;
  1425. //处理消息
  1426. CMD_CS_C_SearchCorrespond * pSearchCorrespond = (CMD_CS_C_SearchCorrespond *)pData;
  1427. pSearchCorrespond->szNickName[CountArray(pSearchCorrespond->szNickName) - 1] = 0;
  1428. //变量定义
  1429. CMD_CS_S_SearchCorrespond SearchCorrespond;
  1430. ZeroMemory(&SearchCorrespond, sizeof(SearchCorrespond));
  1431. //结果用户
  1432. CGlobalUserItem * ResultUserItem[2];
  1433. ZeroMemory(ResultUserItem, sizeof(ResultUserItem));
  1434. //设置变量
  1435. SearchCorrespond.dwSocketID = pSearchCorrespond->dwSocketID;
  1436. SearchCorrespond.dwClientAddr = pSearchCorrespond->dwClientAddr;
  1437. //查找用户
  1438. if (pSearchCorrespond->dwGameID != 0L)
  1439. {
  1440. ResultUserItem[0] = m_GlobalInfoManager.SearchUserItemByGameID(pSearchCorrespond->dwGameID);
  1441. }
  1442. //查找用户
  1443. //if (pSearchCorrespond->szNickName[0] != 0)
  1444. //{
  1445. // _tcslwr(pSearchCorrespond->szNickName);
  1446. //ResultUserItem[1] = m_GlobalInfoManager.SearchUserItemByNickName(pSearchCorrespond->szNickName);
  1447. //}
  1448. //设置结果
  1449. for (BYTE i = 0; i < CountArray(ResultUserItem); i++)
  1450. {
  1451. if (ResultUserItem[i] != NULL)
  1452. {
  1453. //变量定义
  1454. WORD wServerIndex = 0;
  1455. //查找房间
  1456. do
  1457. {
  1458. //查找房间
  1459. CGlobalServerItem * pGlobalServerItem = ResultUserItem[i]->EnumServerItem(wServerIndex++);
  1460. //终止判断
  1461. if (pGlobalServerItem == NULL) break;
  1462. if (SearchCorrespond.wUserCount >= CountArray(SearchCorrespond.UserRemoteInfo)) break;
  1463. //索引定义
  1464. WORD wIndex = SearchCorrespond.wUserCount++;
  1465. //辅助信息
  1466. SearchCorrespond.UserRemoteInfo[wIndex].cbGender = ResultUserItem[i]->GetGender();
  1467. SearchCorrespond.UserRemoteInfo[wIndex].cbMemberOrder = ResultUserItem[i]->GetMemberOrder();
  1468. SearchCorrespond.UserRemoteInfo[wIndex].cbMasterOrder = ResultUserItem[i]->GetMasterOrder();
  1469. //用户信息
  1470. SearchCorrespond.UserRemoteInfo[wIndex].dwUserID = ResultUserItem[i]->GetUserID();
  1471. SearchCorrespond.UserRemoteInfo[wIndex].dwGameID = ResultUserItem[i]->GetGameID();
  1472. //lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szNickName, ResultUserItem[i]->GetNickName(), LEN_NICKNAME);
  1473. //房间信息
  1474. SearchCorrespond.UserRemoteInfo[wIndex].wKindID = pGlobalServerItem->GetKindID();
  1475. SearchCorrespond.UserRemoteInfo[wIndex].wServerID = pGlobalServerItem->GetServerID();
  1476. lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szGameServer, pGlobalServerItem->m_GameServer.szServerName, LEN_SERVER);
  1477. } while (true);
  1478. }
  1479. }
  1480. //发送数据
  1481. WORD wHeadSize = sizeof(SearchCorrespond) - sizeof(SearchCorrespond.UserRemoteInfo);
  1482. WORD wItemSize = sizeof(SearchCorrespond.UserRemoteInfo[0])*SearchCorrespond.wUserCount;
  1483. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_REMOTE_SERVICE, SUB_CS_S_SEARCH_CORRESPOND, &SearchCorrespond, wHeadSize + wItemSize);
  1484. return true;
  1485. }
  1486. default: break;
  1487. }
  1488. return false;
  1489. }
  1490. //管理服务
  1491. bool CAttemperEngineSink::OnTCPNetworkMainManagerService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1492. {
  1493. switch (wSubCmdID)
  1494. {
  1495. case SUB_CS_C_SYSTEM_MESSAGE: //系统消息
  1496. {
  1497. //发送通知
  1498. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_SYSTEM_MESSAGE, pData, wDataSize, 0L);
  1499. return true;
  1500. }
  1501. case SUB_CS_C_PROPERTY_TRUMPET: //喇叭消息
  1502. {
  1503. //发送通知
  1504. m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_PROPERTY_TRUMPET, pData, wDataSize, 0L);
  1505. return true;
  1506. }
  1507. case SUB_CS_C_TELL_CORRESPOND: //服务器发来的心跳
  1508. {
  1509. //效验数据
  1510. ASSERT(wDataSize == sizeof(CMD_CS_C_TellCorr));
  1511. if (wDataSize != sizeof(CMD_CS_C_TellCorr)) return false;
  1512. //消息定义
  1513. CMD_CS_C_TellCorr * pTellCorr = (CMD_CS_C_TellCorr *)pData;
  1514. //获取对象
  1515. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pTellCorr->wServerID);
  1516. if (pGlobalServerItem != NULL)
  1517. {
  1518. pGlobalServerItem->m_GameServer.dwLiveTime = (DWORD)time(NULL);
  1519. CString str;
  1520. str.Format(TEXT("服务器%d 心跳时间[%d]"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.dwLiveTime);
  1521. CCorrespondServerDlg* pCCorrespondServerDlg = (CCorrespondServerDlg*)theApp.m_pMainWnd;
  1522. pCCorrespondServerDlg->aa.SetWindowTextW(str);;
  1523. ///CTraceService::TraceString(str, TraceLevel_Normal);
  1524. }
  1525. else
  1526. {
  1527. //为空则该服务器已经被清空。断开连接。回一个非法包
  1528. m_pITCPNetworkEngine->CloseSocket(dwSocketID);
  1529. //m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
  1530. //WORD wPacketSize = pHead->TCPInfo.wPacketSize;
  1531. //if (wPacketSize > SOCKET_TCP_BUFFER) throw TEXT("数据包超长");
  1532. //if (wPacketSize < sizeof(TCP_Head)) throw TEXT("数据包非法");
  1533. //if (m_wRecvSize < wPacketSize) break;
  1534. }
  1535. return true;
  1536. }
  1537. ///[---add by yd
  1538. case SUB_CS_C_LOGON_HEARTBEAT: // 收到登录服务器的心跳包,更新LogonServer心跳时间
  1539. {
  1540. ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterPlaza));
  1541. if (wDataSize != sizeof(CMD_CS_C_RegisterPlaza))
  1542. {
  1543. return false;
  1544. }
  1545. //消息定义
  1546. //WORD * pwServerID = (WORD *)pData;
  1547. ////获取对象
  1548. //CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItemByServerID(*pwServerID);
  1549. CMD_CS_C_RegisterPlaza * pRegisterPlaza = (CMD_CS_C_RegisterPlaza *)pData;
  1550. //变量定义
  1551. tagGamePlaza GamePlaza;
  1552. ZeroMemory(&GamePlaza, sizeof(GamePlaza));
  1553. //构造数据
  1554. //GamePlaza.wPlazaID = wBindIndex;
  1555. //lstrcpyn(GamePlaza.szServerName, pRegisterPlaza->szServerName, CountArray(GamePlaza.szServerName));
  1556. //lstrcpyn(GamePlaza.szServerAddr, pRegisterPlaza->szServerAddr, CountArray(GamePlaza.szServerAddr));
  1557. //GamePlaza.wServerID = pRegisterPlaza->wServerID;
  1558. //GamePlaza.dwLiveTime = GetTickCount();///(DWORD)time(NULL);
  1559. //m_GlobalInfoManager.ActivePlazaItem(wBindIndex, GamePlaza);
  1560. //获取对象
  1561. //CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItemByServerID(GamePlaza.wServerID);
  1562. CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItem(pRegisterPlaza->wServerID);
  1563. if (pGlobalServerItem != NULL)
  1564. {
  1565. ///---更新当前登录服务器的心跳时间
  1566. pGlobalServerItem->m_GamePlaza.dwLiveTime = GetTickCount();///(DWORD)time(NULL);
  1567. CString str;
  1568. str.Format(TEXT("***登录服务器%d 心跳时间[%d]"), pGlobalServerItem->GetPlazaServerID(), pGlobalServerItem->m_GamePlaza.dwLiveTime);
  1569. CCorrespondServerDlg* pCCorrespondServerDlg = (CCorrespondServerDlg*)theApp.m_pMainWnd;
  1570. pCCorrespondServerDlg->aa.SetWindowTextW(str);
  1571. //CTraceService::TraceString(str, TraceLevel_Normal);
  1572. ///---回一个心跳包
  1573. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_MANAGER_SERVICE, SUB_CS_C_LOGON_HEARTBEAT, pData, wDataSize);
  1574. }
  1575. else
  1576. {
  1577. ASSERT(FALSE);
  1578. CString str;
  1579. str.Format(TEXT("***未找到此登录服务器, wServerID=%d 心跳未发送"), pRegisterPlaza->wServerID);
  1580. CTraceService::TraceString(str, TraceLevel_Normal);
  1581. }
  1582. return true;
  1583. }
  1584. default: break;
  1585. ///---]
  1586. }
  1587. return false;
  1588. }
  1589. //机器服务
  1590. //bool CAttemperEngineSink::OnTCPNetworkMainAndroidService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
  1591. //{
  1592. // switch (wSubCmdID)
  1593. // {
  1594. // case SUB_CS_C_ADDPARAMETER: //添加参数
  1595. // {
  1596. // //参数校验
  1597. // ASSERT(sizeof(CMD_CS_C_AddParameter) == wDataSize);
  1598. // if (sizeof(CMD_CS_C_AddParameter) != wDataSize) return false;
  1599. //
  1600. // //提取数据
  1601. // CMD_CS_C_AddParameter * pAddParameter = (CMD_CS_C_AddParameter *)pData;
  1602. //
  1603. // //构造结构
  1604. // CMD_CS_S_AddParameter AddParameter;
  1605. // CopyMemory(&AddParameter.AndroidParameter, &pAddParameter->AndroidParameter, sizeof(tagAndroidParameter));
  1606. //
  1607. // //发送消息
  1608. // SendDataToGame(pAddParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_ADDPARAMETER, &AddParameter, sizeof(AddParameter));
  1609. //
  1610. // return true;
  1611. // }
  1612. // case SUB_CS_C_MODIFYPARAMETER: //修改参数
  1613. // {
  1614. // //参数校验
  1615. // ASSERT(sizeof(CMD_CS_C_ModifyParameter) == wDataSize);
  1616. // if (sizeof(CMD_CS_C_ModifyParameter) != wDataSize) return false;
  1617. //
  1618. // //提取数据
  1619. // CMD_CS_C_ModifyParameter * pModifyParameter = (CMD_CS_C_ModifyParameter *)pData;
  1620. //
  1621. // //构造结构
  1622. // CMD_CS_S_ModifyParameter ModifyParameter;
  1623. // CopyMemory(&ModifyParameter.AndroidParameter, &pModifyParameter->AndroidParameter, sizeof(tagAndroidParameter));
  1624. //
  1625. // //发送通知
  1626. // SendDataToGame(pModifyParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_MODIFYPARAMETER, &ModifyParameter, sizeof(ModifyParameter));
  1627. //
  1628. // return true;
  1629. // }
  1630. // case SUB_CS_C_DELETEPARAMETER: //删除参数
  1631. // {
  1632. // //参数校验
  1633. // ASSERT(sizeof(CMD_CS_C_DeleteParameter) == wDataSize);
  1634. // if (sizeof(CMD_CS_C_DeleteParameter) != wDataSize) return false;
  1635. //
  1636. // //提取数据
  1637. // CMD_CS_C_DeleteParameter * pDeleteParameter = (CMD_CS_C_DeleteParameter *)pData;
  1638. //
  1639. // //构造结构
  1640. // CMD_CS_S_DeleteParameter DeleteParameter;
  1641. // DeleteParameter.dwBatchID = pDeleteParameter->dwBatchID;
  1642. //
  1643. // //发送通知
  1644. // SendDataToGame(pDeleteParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_DELETEPARAMETER, &DeleteParameter, sizeof(DeleteParameter));
  1645. //
  1646. // return true;
  1647. // }
  1648. // default: break;
  1649. // }
  1650. //
  1651. // return false;
  1652. //}
  1653. //发送私人房间列表总会
  1654. bool CAttemperEngineSink::SendPrivateListItem(DWORD dwSocketID)
  1655. {
  1656. //变量定义
  1657. CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom();
  1658. ///---JN_GR_RoomListBig tempA;
  1659. ///---ZeroMemory(&tempA, sizeof(tempA));
  1660. POSITION Position = pCMapRoomListA->GetStartPosition();
  1661. while (Position != NULL)
  1662. {
  1663. JN_GR_RoomListBig Temp;
  1664. ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig));
  1665. DWORD dwRoomNumber = 0;
  1666. pCMapRoomListA->GetNextAssoc(Position, dwRoomNumber, Temp);
  1667. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, &Temp, sizeof(JN_GR_RoomListBig));
  1668. }
  1669. return true;
  1670. }
  1671. //发送列表
  1672. bool CAttemperEngineSink::SendServerListItem(DWORD dwSocketID)
  1673. {
  1674. //变量定义
  1675. WORD wPacketSize = 0L;
  1676. POSITION Position = NULL;
  1677. BYTE cbBuffer[SOCKET_TCP_PACKET];
  1678. //发送信息
  1679. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INFO);
  1680. //收集数据
  1681. do
  1682. {
  1683. //发送数据
  1684. if ((wPacketSize + sizeof(tagGameServer)) > sizeof(cbBuffer))
  1685. {
  1686. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INSERT, cbBuffer, wPacketSize);
  1687. wPacketSize = 0;
  1688. }
  1689. //获取对象
  1690. tagGameServer * pGameServer = (tagGameServer *)(cbBuffer + wPacketSize);
  1691. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position);
  1692. //设置数据
  1693. if (pGlobalServerItem != NULL)
  1694. {
  1695. wPacketSize += sizeof(tagGameServer);
  1696. CopyMemory(pGameServer, &pGlobalServerItem->m_GameServer, sizeof(tagGameServer));
  1697. }
  1698. } while (Position != NULL);
  1699. //发送数据
  1700. if (wPacketSize > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INSERT, cbBuffer, wPacketSize);
  1701. //发送完成
  1702. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_FINISH);
  1703. return true;
  1704. }
  1705. //发送列表
  1706. bool CAttemperEngineSink::SendMatchListItem(DWORD dwSocketID)
  1707. {
  1708. //变量定义
  1709. WORD wPacketSize = 0L;
  1710. POSITION Position = NULL;
  1711. BYTE cbBuffer[SOCKET_TCP_PACKET];
  1712. //收集数据
  1713. do
  1714. {
  1715. //发送数据
  1716. if ((wPacketSize + sizeof(tagGameServer)) > sizeof(cbBuffer))
  1717. {
  1718. m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_MATCH_INSERT, cbBuffer, wPacketSize);
  1719. wPacketSize = 0;
  1720. }
  1721. //获取对象
  1722. tagGameMatch * pGameMatch = (tagGameMatch *)(cbBuffer + wPacketSize);
  1723. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position);
  1724. //设置数据
  1725. if (pGlobalServerItem != NULL && pGlobalServerItem->IsMatchServer())
  1726. {
  1727. wPacketSize += sizeof(tagGameMatch);
  1728. CopyMemory(pGameMatch, &pGlobalServerItem->m_GameMatch, sizeof(tagGameMatch));
  1729. }
  1730. } while (Position != NULL);
  1731. //发送数据
  1732. if (wPacketSize > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_MATCH_INSERT, cbBuffer, wPacketSize);
  1733. return true;
  1734. }
  1735. //房间发送
  1736. bool CAttemperEngineSink::SendDataToGame(WORD wServerID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
  1737. {
  1738. //查找房间
  1739. CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(wServerID);
  1740. if (pGlobalServerItem == NULL) return false;
  1741. //获取参数
  1742. WORD wBindIndex = pGlobalServerItem->GetIndex();
  1743. tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
  1744. //发送数据
  1745. DWORD dwSocketID = pBindParameter->dwSocketID;
  1746. m_pITCPNetworkEngine->SendData(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize);
  1747. return true;
  1748. }
  1749. //////////////////////////////////////////////////////////////////////////////////