#include "StdAfx.h" #include "AttemperEngineSink.h" #include "GetRandom.h" #include "CorrespondServer.h" #include "CorrespondServerDlg.h" extern CCorrespondServerApp theApp; ////////////////////////////////////////////////////////////////////////////////// //定时器定义 #define IDI_LOAD_PLATFORM_PARAMETER 1 //加载参数 #define IDI_CHK_GAME_SERVER 2 //心跳 #define IDI_LOAD_SEND_LIST 3 //轮训数据库 #define TIME_LOAD_PLATFORM_PARAMETER 600000 //时间间隔 #define IDI_ROOM 4 //检查清楚超时房间 #define TIME_ROOM_PARAMETER 60*1000 //时间间隔1分钟 ///[---add by yd #define TIMER_ID_CHK_LOGON_SERVER 6 //检查LogonServer的定时器id #define TIMES_CHECK_LOGONSERVER 2*TIMES_LOGONSERVER_HEARTBEAT //检查LogonServer的定时器的时间间隔 ///---] ////////////////////////////////////////////////////////////////////////////////// //构造函数 CAttemperEngineSink::CAttemperEngineSink() { //状态变量 m_wCollectItem = INVALID_WORD; //设置变量 m_pInitParameter = NULL; m_pBindParameter = NULL; //组件变量 m_pITimerEngine = NULL; m_pITCPNetworkEngine = NULL; m_GlobalInfoManager.SetFromP(this); return; } //析构函数 CAttemperEngineSink::~CAttemperEngineSink() { } //接口查询 VOID * CAttemperEngineSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer) { QUERYINTERFACE(IAttemperEngineSink, Guid, dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IAttemperEngineSink, Guid, dwQueryVer); return NULL; } //启动事件 bool CAttemperEngineSink::OnAttemperEngineStart(IUnknownEx * pIUnknownEx) { //绑定参数 m_pBindParameter = new tagBindParameter[m_pInitParameter->m_wMaxConnect]; ZeroMemory(m_pBindParameter, sizeof(tagBindParameter)*m_pInitParameter->m_wMaxConnect); //设置定时器 #ifndef _DEBUG m_pITimerEngine->SetTimer(IDI_LOAD_PLATFORM_PARAMETER, TIME_LOAD_PLATFORM_PARAMETER, TIMES_INFINITY, 0); #else m_pITimerEngine->SetTimer(IDI_LOAD_PLATFORM_PARAMETER, 10*60*1000, TIMES_INFINITY, 0); #endif #ifdef _DEBUG m_pITimerEngine->SetTimer(IDI_CHK_GAME_SERVER, 3500, TIMES_INFINITY, 0); #else m_pITimerEngine->SetTimer(IDI_CHK_GAME_SERVER, 3500, TIMES_INFINITY, 0); #endif //m_pITimerEngine->SetTimer(IDI_CHK_GAME_SERVER, 3500, TIMES_INFINITY, 0); m_pITimerEngine->SetTimer(IDI_ROOM, TIME_ROOM_PARAMETER, TIMES_INFINITY, 0); ///[---add by yd 检查登录服务器 m_pITimerEngine->SetTimer(TIMER_ID_CHK_LOGON_SERVER, TIMES_CHECK_LOGONSERVER, TIMES_INFINITY, 0); ///---] return true; } //停止事件 bool CAttemperEngineSink::OnAttemperEngineConclude(IUnknownEx * pIUnknownEx) { //状态变量 m_wCollectItem = INVALID_WORD; m_WaitCollectItemArray.RemoveAll(); //设置变量 m_pITimerEngine = NULL; m_pITCPNetworkEngine = NULL; //删除数据 SafeDeleteArray(m_pBindParameter); //设置组件 m_GlobalInfoManager.ResetData(); m_GlobalInfoManager.SetFromP(this); ///+++2017-9-18清理下界面 CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; if (p) { while (true) { if (p->bbb.ItemHasChildren(p->hbbRoot)) { HTREEITEM hChildItem = p->bbb.GetChildItem(p->hbbRoot); p->bbb.DeleteItem(hChildItem); } else { break; } } while (true) { if (p->ServiceTree.ItemHasChildren(p->hRoot)) { HTREEITEM hChildItem = p->ServiceTree.GetChildItem(p->hRoot); p->ServiceTree.DeleteItem(hChildItem); } else { break; } } m_ServiceIDMap.RemoveAll(); m_LoginServiceIDMap.RemoveAll(); } return true; } //控制事件 bool CAttemperEngineSink::OnEventControl(WORD wIdentifier, VOID * pData, WORD wDataSize) { return false; } //调度事件 bool CAttemperEngineSink::OnEventAttemperData(WORD wRequestID, VOID * pData, WORD wDataSize) { return false; } //同步事件 bool CAttemperEngineSink::OnTongBu(int Command, DWORD dwContextID, VOID * pData, WORD wDataSize) { return true; } //时间事件 bool CAttemperEngineSink::OnEventTimer(DWORD dwTimerID, WPARAM wBindParam) { //加载参数 if (IDI_LOAD_PLATFORM_PARAMETER == dwTimerID) { //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_PLATFORM_PARAMETER, 0, 0, 0L); return true; } else if (IDI_ROOM == dwTimerID) { CTime tm; tm = CTime::GetCurrentTime(); if (tm.GetHour() == 4 && (tm.GetMinute() == 0 || tm.GetMinute() == 1)) { //检测超时房间 CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData(); pCMapRoomList->RemoveAll(); m_GlobalInfoManager.GetPrivateRoom()->RemoveAll(); /*look3: POSITION pos = pCMapRoomList->GetStartPosition(); while (pos) { DWORD dTest; JN_GR_RoomListGroup temp; ZeroMemory(&temp, sizeof(temp)); pCMapRoomList->GetNextAssoc(pos, dTest, temp); int iNum = 0; if (temp.Num > 10) temp.Num = 10; look2: for (size_t i = 0; i 1000 * 60 * 60 * 23) { //超过一天则清楚 if (temp.Num == 0) { //清除这个人的信息 pCMapRoomList->RemoveKey(dTest); CString csTest; csTest.Format(_T("超时清除 用户ID:%d"), dTest); CTraceService::TraceString(csTest, TraceLevel_Normal); goto look3; } else { DWORD dRoomID = 0; dRoomID = temp.jgrDate[i].dwRoomNumber; temp.jgrDate[i] = temp.jgrDate[temp.Num - 1]; ZeroMemory(&(temp.jgrDate[temp.Num - 1]), sizeof(temp.jgrDate[temp.Num - 1])); CString csTest; csTest.Format(_T("超时清除 房间ID:%d"), dRoomID); CTraceService::TraceString(csTest, TraceLevel_Normal); if (temp.Num > 0) temp.Num--; } goto look2; } } } pCMapRoomList->SetAt(dTest, temp); }*/ } return true; } else if (IDI_CHK_GAME_SERVER == dwTimerID) { POSITION Position = NULL; DWORD dwCurrentTime = (DWORD)time(NULL); bool bDel = false; do { //获取对象 CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position); //设置数据 if (pGlobalServerItem != NULL) { if (dwCurrentTime - pGlobalServerItem->m_GameServer.dwLiveTime > SEVERTIMEOUT) { DWORD dTime = dwCurrentTime - pGlobalServerItem->m_GameServer.dwLiveTime; CString str; str.Format(TEXT("通讯失败超时断开,注销GameServer [%d]%s:%d, 超时时间%d 当前时间%d"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.szServerAddr, pGlobalServerItem->m_GameServer.wServerPort, dTime, dwCurrentTime); CTraceService::TraceString(str, TraceLevel_Warning); //变量定义 CMD_CS_S_ServerRemove ServerRemove; ZeroMemory(&ServerRemove, sizeof(ServerRemove)); //删除通知 ServerRemove.wServerID = pGlobalServerItem->GetServerID(); m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_REMOVE, &ServerRemove, sizeof(ServerRemove), 0L); //注销房间 m_GlobalInfoManager.DeleteServerItem(pGlobalServerItem->GetServerID()); bDel = true; } } } while (Position != NULL); if (bDel) { Position = NULL; CTraceService::TraceString(TEXT("当前的GameServer列表:"), TraceLevel_Normal); do { //获取对象 CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position); if (pGlobalServerItem != NULL) { CString str; str.Format(TEXT("[%d] %s : %d"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.szServerAddr, pGlobalServerItem->m_GameServer.wServerPort); CTraceService::TraceString(str, TraceLevel_Normal); } } while (Position != NULL); } return true; } ///[--- add by yd 检查登录服务器是否掉线 else if (TIMER_ID_CHK_LOGON_SERVER == dwTimerID) { //static int iCount = 0; //iCount++; POSITION Position = NULL; DWORD dwCurrentTime = GetTickCount(); ///--(DWORD)time(NULL); bool bDel = false; do { //获取对象 CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.EnumPlazaItem(Position); //设置数据 if (pGlobalServerItem != NULL) { ///---超过上报时间的3倍时长(即3次都没有收到心跳) if ((dwCurrentTime - pGlobalServerItem->m_GamePlaza.dwLiveTime) > 5 * TIMES_LOGONSERVER_HEARTBEAT) { DWORD dTime = dwCurrentTime - pGlobalServerItem->m_GamePlaza.dwLiveTime; CString str; str.Format(TEXT("**登录通讯失败超时断开,注销LogonServer [%d]%s, 超时时间%d 当前时间%d"), pGlobalServerItem->GetPlazaServerID(), pGlobalServerItem->m_GamePlaza.szServerAddr, dTime, dwCurrentTime); CTraceService::TraceString(str, TraceLevel_Warning); HTREEITEM hTemp; if (m_LoginServiceIDMap.Lookup(pGlobalServerItem->m_GamePlaza.wPlazaID, hTemp)) { CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; if (p) { p->bbb.DeleteItem(hTemp); } m_LoginServiceIDMap.RemoveKey(pGlobalServerItem->m_GamePlaza.wPlazaID); } else { //提示消息 CString cstr = L""; cstr.Format(L"超过上报m_LoginServiceIDMap hTemp不存在:%d", pGlobalServerItem->m_GamePlaza.wPlazaID); CTraceService::TraceString(cstr, TraceLevel_Warning); //CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; //if (p) //{ // CString csIpPort; // csIpPort.Format(L"%s:%s 编号[%d]", CString(pGlobalServerItem->m_GamePlaza.szServerAddr), pGlobalServerItem->m_GamePlaza.szServerName, pGlobalServerItem->m_GamePlaza.wPlazaID); // HTREEITEM aa = p->bbb.InsertItem(csIpPort, 1, 1, p->hbbRoot, TVI_LAST); // p->bbb.SetItemData(aa, 0); // m_LoginServiceIDMap[pGlobalServerItem->m_GamePlaza.wPlazaID] = aa; //} } //删除登录服务器 m_GlobalInfoManager.DeletePlazaItem(pGlobalServerItem->m_GamePlaza.wPlazaID); bDel = true; } } } while (Position != NULL); if (bDel) { Position = NULL; CTraceService::TraceString(TEXT("当前的LogonServer列表:"), TraceLevel_Normal); do { //获取对象 CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.EnumPlazaItem(Position); if (pGlobalServerItem != NULL) { CString str; str.Format(TEXT("[%d]-%s"), pGlobalServerItem->GetPlazaServerID(), pGlobalServerItem->m_GamePlaza.szServerAddr); CTraceService::TraceString(str, TraceLevel_Normal); } } while (Position != NULL); } return true; } return false; } //应答事件 bool CAttemperEngineSink::OnEventTCPNetworkBind(DWORD dwClientAddr, DWORD dwSocketID) { //获取索引 ASSERT(LOWORD(dwSocketID) < m_pInitParameter->m_wMaxConnect); if (LOWORD(dwSocketID) >= m_pInitParameter->m_wMaxConnect) return false; //变量定义 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //设置变量 pBindParameter->dwSocketID = dwSocketID; pBindParameter->dwClientAddr = dwClientAddr; pBindParameter->dwActiveTime = (DWORD)time(NULL); return true; } //读取事件 bool CAttemperEngineSink::OnEventTCPNetworkRead(TCP_Command Command, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (Command.wMainCmdID) { case MDM_CS_REGISTER: //服务注册 { return OnTCPNetworkMainRegister(Command.wSubCmdID, pData, wDataSize, dwSocketID); } case MDM_CS_SERVICE_INFO: //服务信息 { return OnTCPNetworkMainServiceInfo(Command.wSubCmdID, pData, wDataSize, dwSocketID); } case MDM_CS_USER_COLLECT: //用户命令 { return OnTCPNetworkMainUserCollect(Command.wSubCmdID, pData, wDataSize, dwSocketID); } case MDM_CS_REMOTE_SERVICE: //远程服务 { return OnTCPNetworkMainRemoteService(Command.wSubCmdID, pData, wDataSize, dwSocketID); } case MDM_CS_MANAGER_SERVICE: //管理服务 { return OnTCPNetworkMainManagerService(Command.wSubCmdID, pData, wDataSize, dwSocketID); } //case MDM_CS_ANDROID_SERVICE: //机器服务 //{ // return OnTCPNetworkMainAndroidService(Command.wSubCmdID, pData, wDataSize, dwSocketID); //} default: break; } return false; } //关闭事件 ---会话Socket断开 bool CAttemperEngineSink::OnEventTCPNetworkShut(DWORD dwClientAddr, DWORD dwActiveTime, DWORD dwSocketID) { //获取信息 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //游戏服务 ---GameServer断开 if (pBindParameter->ServiceKind == ServiceKind_Game) { //变量定义 WORD wBindIndexTemp = LOWORD(dwSocketID); //汇总处理 if (wBindIndexTemp == m_wCollectItem) { //设置变量 m_wCollectItem = INVALID_WORD; //汇总切换 if (m_WaitCollectItemArray.GetCount() > 0) { //提取变量 INT_PTR nWaitCount = m_WaitCollectItemArray.GetCount(); m_wCollectItem = m_WaitCollectItemArray[nWaitCount - 1]; //删除数组 m_WaitCollectItemArray.RemoveAt(nWaitCount - 1); //发送消息 DWORD dwSocketIDTemp = (m_pBindParameter + m_wCollectItem)->dwSocketID; m_pITCPNetworkEngine->SendData(dwSocketIDTemp, MDM_CS_USER_COLLECT, SUB_CS_S_COLLECT_REQUEST); } } else { //删除等待 for (INT_PTR i = 0; i < m_WaitCollectItemArray.GetCount(); i++) { if (wBindIndexTemp == m_WaitCollectItemArray[i]) { m_WaitCollectItemArray.RemoveAt(i); break; } } } //变量定义 CMD_CS_S_ServerRemove ServerRemove; ZeroMemory(&ServerRemove, sizeof(ServerRemove)); //删除通知 ServerRemove.wServerID = pBindParameter->wServiceID; m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_REMOVE, &ServerRemove, sizeof(ServerRemove), 0L); //注销房间 m_GlobalInfoManager.DeleteServerItem(pBindParameter->wServiceID); HTREEITEM hTemp; if (m_ServiceIDMap.Lookup(pBindParameter->wServiceID, hTemp)) { CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; if (p) { p->ServiceTree.DeleteItem(hTemp); } m_ServiceIDMap.RemoveKey(pBindParameter->wServiceID); } POSITION Position = NULL; CTraceService::TraceString(TEXT("GameServer被动断开断开,当前的GameServer列表:"), TraceLevel_Normal); do { //获取对象 CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position); if (pGlobalServerItem != NULL) { CString str; str.Format(TEXT("[%d] %s : %d"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.szServerAddr, pGlobalServerItem->m_GameServer.wServerPort); CTraceService::TraceString(str, TraceLevel_Normal); } } while (Position != NULL); } else if (pBindParameter->ServiceKind == ServiceKind_Plaza) //广场服务 ---LogonServer断开 { //变量定义 //WORD wBindIndex = LOWORD(dwSocketID); //tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //提示消息 CString cstr = L""; cstr.Format(L"关闭事件 ---会话Socket断开 pBindParameter->ServiceKind LogonServer断开:%d", pBindParameter->wServiceID); CTraceService::TraceString(cstr, TraceLevel_Normal); //注销房间 m_GlobalInfoManager.DeletePlazaItem(pBindParameter->wServiceID); HTREEITEM hTemp; if (m_LoginServiceIDMap.Lookup(pBindParameter->wServiceID, hTemp)) { CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; if (p) { p->bbb.DeleteItem(hTemp); } //提示消息 CString cstrTemp = L""; cstrTemp.Format(L"关闭事件 m_LoginServiceIDMap删除key:%d", pBindParameter->wServiceID); CTraceService::TraceString(cstrTemp, TraceLevel_Warning); ///---add by yd 201-8-4 m_LoginServiceIDMap.RemoveKey(pBindParameter->wServiceID); } } //清除信息 ZeroMemory(pBindParameter, sizeof(tagBindParameter)); return false; } //数据库事件 bool CAttemperEngineSink::OnEventDataBase(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize) { return false; } //关闭事件 bool CAttemperEngineSink::OnEventTCPSocketShut(WORD wServiceID, BYTE cbShutReason) { return false; } //连接事件 bool CAttemperEngineSink::OnEventTCPSocketLink(WORD wServiceID, INT nErrorCode) { return false; } //读取事件 bool CAttemperEngineSink::OnEventTCPSocketRead(WORD wServiceID, TCP_Command Command, VOID * pData, WORD wDataSize) { return true; } //注册服务 bool CAttemperEngineSink::OnTCPNetworkMainRegister(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_C_REGISTER_PLAZA: //注册登陆服务器 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterPlaza)); if (wDataSize != sizeof(CMD_CS_C_RegisterPlaza)) return false; //消息定义 CMD_CS_C_RegisterPlaza * pRegisterPlaza = (CMD_CS_C_RegisterPlaza *)pData; //有效判断 if ((pRegisterPlaza->szServerName[0] == 0) || (pRegisterPlaza->szServerAddr[0] == 0)) { //变量定义 CMD_CS_S_RegisterFailure RegisterFailure; ZeroMemory(&RegisterFailure, sizeof(RegisterFailure)); //设置变量 RegisterFailure.lErrorCode = 0L; lstrcpyn(RegisterFailure.szDescribeString, TEXT("服务器注册失败,“服务地址”与“服务器名”不合法!"), CountArray(RegisterFailure.szDescribeString)); //发送消息 WORD wStringSize = CountStringBuffer(RegisterFailure.szDescribeString); WORD wSendSize = sizeof(RegisterFailure) - sizeof(RegisterFailure.szDescribeString) + wStringSize; m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_REGISTER, SUB_CS_S_REGISTER_FAILURE, &RegisterFailure, wSendSize); //中断网络 m_pITCPNetworkEngine->ShutDownSocket(dwSocketID); return true; } //设置绑定 WORD wBindIndex = LOWORD(dwSocketID); (m_pBindParameter + wBindIndex)->wServiceID = pRegisterPlaza->wServerID; (m_pBindParameter + wBindIndex)->ServiceKind = ServiceKind_Plaza; //变量定义 tagGamePlaza GamePlaza; ZeroMemory(&GamePlaza, sizeof(GamePlaza)); //构造数据 GamePlaza.wPlazaID = pRegisterPlaza->wServerID;//wBindIndex; lstrcpyn(GamePlaza.szServerName, pRegisterPlaza->szServerName, CountArray(GamePlaza.szServerName)); lstrcpyn(GamePlaza.szServerAddr, pRegisterPlaza->szServerAddr, CountArray(GamePlaza.szServerAddr)); ///[---add by yd 初始化当前时间 GamePlaza.wServerID = pRegisterPlaza->wServerID; GamePlaza.dwLiveTime = GetTickCount();///(DWORD)time(NULL); ///---] //注册房间 m_GlobalInfoManager.ActivePlazaItem(wBindIndex, GamePlaza); HTREEITEM hTemp; if (m_LoginServiceIDMap.Lookup(GamePlaza.wPlazaID/*(m_pBindParameter + wBindIndex)->wServiceID*/, hTemp)) { CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; if (p) { p->bbb.DeleteItem(hTemp); } //提示消息 CString cstr = L""; cstr.Format(L"m_LoginServiceIDMap能找到:%d,hTemp存在先删除了,再加入", GamePlaza.wPlazaID); CTraceService::TraceString(cstr, TraceLevel_Warning); CString csIpPort; csIpPort.Format(L"%s:%s 编号[%d]", CString(pRegisterPlaza->szServerAddr), pRegisterPlaza->szServerName, GamePlaza.wPlazaID/* (m_pBindParameter + wBindIndex)->wServiceID*/); HTREEITEM aa = p->bbb.InsertItem(csIpPort, 1, 1, p->hbbRoot, TVI_LAST); p->bbb.SetItemData(aa, 0); m_LoginServiceIDMap[GamePlaza.wPlazaID/*(m_pBindParameter + wBindIndex)->wServiceID*/] = aa; } else { CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; if (p) { CString csIpPort; csIpPort.Format(L"%s:%s 编号[%d]", CString(pRegisterPlaza->szServerAddr), CString(pRegisterPlaza->szServerName), GamePlaza.wPlazaID/*(m_pBindParameter + wBindIndex)->wServiceID*/); HTREEITEM aa = p->bbb.InsertItem(csIpPort, 1, 1, p->hbbRoot, TVI_LAST); p->bbb.SetItemData(aa, 0); m_LoginServiceIDMap[GamePlaza.wPlazaID/*(m_pBindParameter + wBindIndex)->wServiceID*/] = aa; } } POSITION Position = NULL; CTraceService::TraceString(TEXT("一个登陆服务器加入,当前的登陆服务器列表:"), TraceLevel_Normal); do { //获取对象 CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.EnumPlazaItem(Position); if (pGlobalServerItem != NULL) { CString str; str.Format(TEXT("[%s] %s : %d"), pGlobalServerItem->m_GamePlaza.szServerName, pGlobalServerItem->m_GamePlaza.szServerAddr, pGlobalServerItem->m_GamePlaza.wPlazaID); CTraceService::TraceString(str, TraceLevel_Normal); } } while (Position != NULL); //发送列表 SendServerListItem(dwSocketID); SendMatchListItem(dwSocketID); //群发设置 m_pITCPNetworkEngine->AllowBatchSend(dwSocketID, true, 0L); return true; } case SUB_CS_C_REGISTER_SERVER: //注册游戏中心服务器 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterServer)); if (wDataSize != sizeof(CMD_CS_C_RegisterServer)) return false; //消息定义 CMD_CS_C_RegisterServer * pRegisterServer = (CMD_CS_C_RegisterServer *)pData; //查找房间 if (m_GlobalInfoManager.SearchServerItem(pRegisterServer->wServerID) != NULL) { //存在的话先注销旧的 //变量定义 CMD_CS_S_ServerRemove ServerRemove; ZeroMemory(&ServerRemove, sizeof(ServerRemove)); //删除通知 ServerRemove.wServerID = pRegisterServer->wServerID; m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_REMOVE, &ServerRemove, sizeof(ServerRemove), 0L); //注销房间 m_GlobalInfoManager.DeleteServerItem(pRegisterServer->wServerID); ////变量定义 //CMD_CS_S_RegisterFailure RegisterFailure; //ZeroMemory(&RegisterFailure, sizeof(RegisterFailure)); ////设置变量 //RegisterFailure.lErrorCode = 0L; //lstrcpyn(RegisterFailure.szDescribeString, TEXT("已经存在相同标识的游戏房间服务,房间服务注册失败"), CountArray(RegisterFailure.szDescribeString)); ////发送消息 //WORD wStringSize = CountStringBuffer(RegisterFailure.szDescribeString); //WORD wSendSize = sizeof(RegisterFailure) - sizeof(RegisterFailure.szDescribeString) + wStringSize; //m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_REGISTER, SUB_CS_S_REGISTER_FAILURE, &RegisterFailure, wSendSize); ////中断网络 //m_pITCPNetworkEngine->ShutDownSocket(dwSocketID); //return true; } //设置绑定 WORD wBindIndex = LOWORD(dwSocketID); (m_pBindParameter + wBindIndex)->ServiceKind = ServiceKind_Game; (m_pBindParameter + wBindIndex)->wServiceID = pRegisterServer->wServerID; //变量定义 tagGameServer GameServer; ZeroMemory(&GameServer, sizeof(GameServer)); //构造数据 GameServer.wKindID = pRegisterServer->wKindID; GameServer.wNodeID = pRegisterServer->wNodeID; GameServer.wSortID = pRegisterServer->wSortID; GameServer.wServerID = pRegisterServer->wServerID; GameServer.wServerKind = pRegisterServer->wServerKind; GameServer.wServerType = pRegisterServer->wServerType; GameServer.wServerPort = pRegisterServer->wServerPort; GameServer.lCellScore = pRegisterServer->lCellScore; GameServer.lEnterScore = pRegisterServer->lEnterScore; GameServer.dwServerRule = pRegisterServer->dwServerRule; GameServer.dwOnLineCount = pRegisterServer->dwOnLineCount; GameServer.dwFullCount = pRegisterServer->dwFullCount; GameServer.wTableFullCount = pRegisterServer->dwFullTable; GameServer.wServerLevel = pRegisterServer->wServerLevel; GameServer.bService = pRegisterServer->bService; GameServer.dwLiveTime = (DWORD)time(NULL); lstrcpyn(GameServer.szServerName, pRegisterServer->szServerName, CountArray(GameServer.szServerName)); lstrcpyn(GameServer.szServerAddr, pRegisterServer->szServerAddr, CountArray(GameServer.szServerAddr)); TCHAR szClientAddr[16] = TEXT(""); BYTE * pClientAddr = (BYTE *)&(m_pBindParameter + wBindIndex)->dwClientAddr; _sntprintf(szClientAddr, CountArray(szClientAddr), TEXT("%d.%d.%d.%d"), pClientAddr[0], pClientAddr[1], pClientAddr[2], pClientAddr[3]); //注册房间 m_GlobalInfoManager.ActiveServerItem(wBindIndex, GameServer); HTREEITEM hTemp; if (m_ServiceIDMap.Lookup(pRegisterServer->wServerID, hTemp)) { CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; if (p) { p->ServiceTree.DeleteItem(hTemp); } CString csIpPort; 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); HTREEITEM aa = p->ServiceTree.InsertItem(csIpPort, 1, 1, p->hRoot, TVI_LAST); p->ServiceTree.SetItemData(aa, GameServer.wServerID); m_ServiceIDMap[pRegisterServer->wServerID] = aa; } else { CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; if (p) { CString csIpPort; 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); HTREEITEM aa = p->ServiceTree.InsertItem(csIpPort, 1, 1, p->hRoot, TVI_LAST); p->ServiceTree.SetItemData(aa, GameServer.wServerID); m_ServiceIDMap[pRegisterServer->wServerID] = aa; } } //群发房间 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INSERT, &GameServer, sizeof(GameServer), 0L); //发送列表 SendServerListItem(dwSocketID); SendMatchListItem(dwSocketID); //发送所有私人房间列表 SendPrivateListItem(dwSocketID); //群发设置 m_pITCPNetworkEngine->AllowBatchSend(dwSocketID, true, 0L); //汇总通知 if (m_wCollectItem == INVALID_WORD) { m_wCollectItem = wBindIndex; m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_USER_COLLECT, SUB_CS_S_COLLECT_REQUEST); } else m_WaitCollectItemArray.Add(wBindIndex); POSITION Position = NULL; CString csTest; csTest.Format(L"GameServer加入[%s][%d]", szClientAddr, (m_pBindParameter + wBindIndex)->wServiceID); CTraceService::TraceString(csTest, TraceLevel_Normal); do { //获取对象 CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position); if (pGlobalServerItem != NULL) { CString str; str.Format(TEXT("[%d] %s : %d"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.szServerAddr, pGlobalServerItem->m_GameServer.wServerPort); CTraceService::TraceString(str, TraceLevel_Normal); } } while (Position != NULL); return true; } case SUB_CS_C_REGISTER_MATCH: //注册比赛 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterMatch)); if (wDataSize != sizeof(CMD_CS_C_RegisterMatch)) return false; //消息定义 CMD_CS_C_RegisterMatch * pRegisterMatch = (CMD_CS_C_RegisterMatch *)pData; //查找房间 CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pRegisterMatch->wServerID); if (pGlobalServerItem == NULL) return true; //变量定义 tagGameMatch GameMatch; ZeroMemory(&GameMatch, sizeof(GameMatch)); //构造数据 GameMatch.wServerID = pRegisterMatch->wServerID; GameMatch.dwMatchID = pRegisterMatch->dwMatchID; GameMatch.dwMatchNO = pRegisterMatch->dwMatchNO; GameMatch.cbMatchType = pRegisterMatch->cbMatchType; GameMatch.lMatchFee = pRegisterMatch->lMatchFee; GameMatch.cbMatchFeeType = pRegisterMatch->cbMatchFeeType; GameMatch.cbMemberOrder = pRegisterMatch->cbMemberOrder; GameMatch.wRewardCount = pRegisterMatch->wRewardCount; GameMatch.MatchEndTime = pRegisterMatch->MatchEndTime; GameMatch.MatchStartTime = pRegisterMatch->MatchStartTime; GameMatch.wStartUserCount = pRegisterMatch->wStartUserCount; GameMatch.wMatchPlayCount = pRegisterMatch->wMatchPlayCount; lstrcpyn(GameMatch.szMatchName, pRegisterMatch->szMatchName, CountArray(GameMatch.szMatchName)); //拷贝数据 CopyMemory(&pGlobalServerItem->m_GameMatch, &GameMatch, sizeof(pGlobalServerItem->m_GameMatch)); //群发房间 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_MATCH_INSERT, &GameMatch, sizeof(GameMatch), 0L); return true; } default: break; } return false; } //服务状态 bool CAttemperEngineSink::OnTCPNetworkMainServiceInfo(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_UPDATASERVICE: //服务器状态更新 { ASSERT(wDataSize == sizeof(JN_GR_SERVICESTAT)); if (wDataSize != sizeof(JN_GR_SERVICESTAT)) return false; //消息定义 JN_GR_SERVICESTAT * pServerOnLine = (JN_GR_SERVICESTAT *)pData; //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind == ServiceKind_Game); if (pBindParameter->ServiceKind != ServiceKind_Game) return false; //查找房间 WORD wServerID = pBindParameter->wServiceID; ASSERT(wServerID == pServerOnLine->dwServerID); if (wServerID != pServerOnLine->dwServerID) return false; CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(wServerID); //设置人数 if (pGlobalServerItem != NULL) { //变量定义 JN_GR_SERVICESTAT ServerOnLine; ZeroMemory(&ServerOnLine, sizeof(ServerOnLine)); ServerOnLine.bService = pServerOnLine->bService; ServerOnLine.dwServerID = pServerOnLine->dwServerID; CCorrespondServerDlg *p = (CCorrespondServerDlg *)theApp.m_pMainWnd; //查找房间 //修改房间信息 pGlobalServerItem->m_GameServer.bService = pServerOnLine->bService; if (p) { HTREEITEM startitem = p->ServiceTree.GetChildItem(p->hRoot); while (startitem) { CString strTemp = p->ServiceTree.GetItemText(startitem); DWORD dData = p->ServiceTree.GetItemData(startitem); if (dData == pServerOnLine->dwServerID) { if (pGlobalServerItem->m_GameServer.bService > 0) { //正常服务状态 p->ServiceTree.SetItemImage(startitem, 1, 1); break; } else if (pGlobalServerItem->m_GameServer.bService == 0) { //主动不提供服务状态 p->ServiceTree.SetItemImage(startitem, 2, 2); break; } else { //被攻击无法服务状态 p->ServiceTree.SetItemImage(startitem, 3, 3); break; } } startitem = p->ServiceTree.GetNextSiblingItem(startitem); } } //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_STAT, &ServerOnLine, sizeof(ServerOnLine), 0L); } return true; } case SUB_CS_C_SERVER_ONLINE: //房间人数 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_ServerOnLine)); if (wDataSize != sizeof(CMD_CS_C_ServerOnLine)) return false; //消息定义 CMD_CS_C_ServerOnLine * pServerOnLine = (CMD_CS_C_ServerOnLine *)pData; //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind == ServiceKind_Game); if (pBindParameter->ServiceKind != ServiceKind_Game) return false; //查找房间 WORD wServerID = pBindParameter->wServiceID; CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(wServerID); //设置人数 if (pGlobalServerItem != NULL) { //变量定义 CMD_CS_S_ServerOnLine ServerOnLine; ZeroMemory(&ServerOnLine, sizeof(ServerOnLine)); //设置变量 pGlobalServerItem->m_GameServer.dwOnLineCount = pServerOnLine->dwOnLineCount; //设置变量 ServerOnLine.wServerID = wServerID; ServerOnLine.dwOnLineCount = pServerOnLine->dwOnLineCount; ServerOnLine.wTableOnlineCount = pServerOnLine->wTableOnlineCount;//在线桌子数 ServerOnLine.wTableFullCount = pServerOnLine->wTableFullCount; //满员桌子数 pGlobalServerItem->m_GameServer.wTableOnlineCount = pServerOnLine->wTableOnlineCount; pGlobalServerItem->m_GameServer.dwOnLineCount = pServerOnLine->dwOnLineCount; pGlobalServerItem->m_GameServer.wTableFullCount = pServerOnLine->wTableFullCount; m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_ONLINE, &ServerOnLine, sizeof(ServerOnLine), 0L); //存储信息到redis std::vector> field_val; field_val.push_back({ "wServerID", string_format("%d",ServerOnLine.wServerID) }); field_val.push_back({ "dwOnLineCount", string_format("%d",ServerOnLine.dwOnLineCount) }); field_val.push_back({ "wTableOnlineCount", string_format("%d",ServerOnLine.wTableOnlineCount) }); field_val.push_back({ "wTableFullCount", string_format("%d",ServerOnLine.wTableFullCount) }); m_RedisClient->GetRedisClient()->hmset(string_format("Server_Info:%d", ServerOnLine.wServerID), field_val, [](const cpp_redis::reply& reply) { std::cout << "hmset: " << reply << std::endl; }); m_RedisClient->GetRedisClient()->sync_commit(); } return true; } case SUB_CS_C_SERVER_ONLINE_ACK: //房间人数应答 ///---是GameServer实例个数 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_S_ServerAllOnLine)); if (wDataSize != sizeof(CMD_CS_S_ServerAllOnLine)) return false; //消息定义 CMD_CS_S_ServerAllOnLine * pServerOnLine = (CMD_CS_S_ServerAllOnLine *)pData; DWORD dNum = m_GlobalInfoManager.GetServerItemCount(); if (dNum != pServerOnLine->dwServerNum) { m_pITCPNetworkEngine->CloseSocket(dwSocketID); //主动断开通讯,清理工作交给超时检测。 } return true; } case SUB_CS_C_SERVER_MODIFY: //房间修改 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_ServerModify)); if (wDataSize != sizeof(CMD_CS_C_ServerModify)) return false; //消息定义 CMD_CS_C_ServerModify * pServerModify = (CMD_CS_C_ServerModify *)pData; //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind == ServiceKind_Game); if (pBindParameter->ServiceKind != ServiceKind_Game) return false; //查找房间 ASSERT(m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID) != NULL); CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID); //房间修改 if (pGlobalServerItem != NULL) { //设置变量 pGlobalServerItem->m_GameServer.wSortID = pServerModify->wSortID; pGlobalServerItem->m_GameServer.wKindID = pServerModify->wKindID; pGlobalServerItem->m_GameServer.wNodeID = pServerModify->wNodeID; pGlobalServerItem->m_GameServer.wServerPort = pServerModify->wServerPort; pGlobalServerItem->m_GameServer.dwOnLineCount = pServerModify->dwOnLineCount; pGlobalServerItem->m_GameServer.wTableFullCount = pServerModify->wTableFullCount; //满员桌子数 pGlobalServerItem->m_GameServer.wTableOnlineCount = pServerModify->wTableOnlineCount; //在线桌子数 pGlobalServerItem->m_GameServer.dwFullCount = pServerModify->dwFullCount; lstrcpyn(pGlobalServerItem->m_GameServer.szServerName, pServerModify->szServerName, CountArray(pGlobalServerItem->m_GameServer.szServerName)); lstrcpyn(pGlobalServerItem->m_GameServer.szServerAddr, pServerModify->szServerAddr, CountArray(pGlobalServerItem->m_GameServer.szServerAddr)); //变量定义 CMD_CS_S_ServerModify ServerModify; ZeroMemory(&ServerModify, sizeof(ServerModify)); //设置变量 ServerModify.wKindID = pServerModify->wKindID; ServerModify.wSortID = pServerModify->wSortID; ServerModify.wNodeID = pServerModify->wNodeID; ServerModify.wServerID = pBindParameter->wServiceID; ServerModify.wServerPort = pServerModify->wServerPort; ServerModify.dwFullCount = pServerModify->dwFullCount; lstrcpyn(ServerModify.szServerAddr, pServerModify->szServerAddr, CountArray(ServerModify.szServerAddr)); lstrcpyn(ServerModify.szServerName, pServerModify->szServerName, CountArray(ServerModify.szServerName)); //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_MODIFY, &ServerModify, sizeof(ServerModify), 0L); } return true; } case SUB_CS_C_SERVER_JULI: { //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_C_SERVER_JULI_ACK, pData, wDataSize, 0L); return true; } default: break; } return false; } //登录失败 bool CAttemperEngineSink::SendLogonFailure(LPCTSTR pszString, LONG lErrorCode, DWORD dwSocketID) { CTraceService::TraceString(TEXT("登录失败 SendLogonFailure"), TraceLevel_Exception); //变量定义 CMD_GR_LogonFailureEx LogonFailure; ZeroMemory(&LogonFailure, sizeof(LogonFailure)); //构造数据 LogonFailure.lErrorCode = lErrorCode; lstrcpyn(LogonFailure.szDescribeString, pszString, CountArray(LogonFailure.szDescribeString)); //数据属性 WORD wDataSize = CountStringBuffer(LogonFailure.szDescribeString); WORD wHeadSize = sizeof(LogonFailure) - sizeof(LogonFailure.szDescribeString); m_pITCPNetworkEngine->SendData(dwSocketID, MDM_GR_LOGON, SUB_GR_LOGON_FAILURE, &LogonFailure, wHeadSize + wDataSize); return true; } //用户处理 bool CAttemperEngineSink::OnTCPNetworkMainUserCollect(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_DISSOLVEROOM: { //群主解散俱乐部房间 ASSERT(wDataSize == sizeof(DWORD)); if (wDataSize != sizeof(DWORD)) return false; //DWORD *dwRoomID = (DWORD *)pData; //广播给特定服务器 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_DISSOLVEROOM, pData, wDataSize); } } return true; } case SUB_CS_ChangServer: { //向协调申请换服务器开房 ASSERT(wDataSize == sizeof(CMD_GR_ClubAction2_XT)); if (wDataSize != sizeof(CMD_GR_ClubAction2_XT)) return false; CMD_GR_ClubAction2_XT *pClubAction = (CMD_GR_ClubAction2_XT *)pData; //广播给特定服务器 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL && pCGlobalServerItem->GetServerID() == pClubAction->dwServerID) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_ChangServer, pData, wDataSize); } } return true; } case SUB_CS_C_USER_SendMessage: { ASSERT(wDataSize == sizeof(CMD_GR_Club_NotifyEX_ACK)); if (wDataSize != sizeof(CMD_GR_Club_NotifyEX_ACK)) return false; CMD_GR_Club_NotifyEX_ACK* pInfo = (CMD_GR_Club_NotifyEX_ACK*)pData; //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind == ServiceKind_Game); if (pBindParameter->ServiceKind != ServiceKind_Game) return false; //向所有服务器广播该信息 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_SendMessage, pInfo, sizeof(CMD_GR_Club_NotifyEX_ACK)); } } return true; } case SUB_CS_C_GET_ROOMID: ///---??用户创建房间时返回的房间ID(由协调统一生成唯一ID) { //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind == ServiceKind_Game); if (pBindParameter->ServiceKind != ServiceKind_Game) return false; DWORD dRet = GetRandom::GetRandomValue(); CMD_CS_UserSitDownEx * pUserSitDown = (CMD_CS_UserSitDownEx *)pData; pUserSitDown->RoomID = dRet; SendDataToGame(pBindParameter->wServiceID, MDM_CS_USER_COLLECT, SUB_CS_C_GET_ROOMID, pData, wDataSize); return true; } case SUB_CS_UPDATAOWNBEANS_UNLOCK: { ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResultEX)); if (wDataSize != sizeof(DBO_GR_UserReduceResultEX)) return false; DBO_GR_UserReduceResultEX* pInfo = (DBO_GR_UserReduceResultEX*)pData; CGlobalUserItem *pCGlobalUserItem = m_GlobalInfoManager.SearchUserItemByUserID(pInfo->dwUserID); if (pCGlobalUserItem && pCGlobalUserItem->m_ServerID!=0) { int i = 0; CGlobalServerItem * p = pCGlobalUserItem->EnumServerItem(i); while (p) { if (p->GetServerID() == pCGlobalUserItem->m_ServerID) { //向最近登录的服务器,发送。 SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_UNLOCK, pData, wDataSize); break; } i++; p = pCGlobalUserItem->EnumServerItem(i); } } return true; } case SUB_CS_UPDATAOWNBEANS_LOCK: { ASSERT(wDataSize == sizeof(DBO_GR_UserReduceResultEX)); if (wDataSize != sizeof(DBO_GR_UserReduceResultEX)) return false; DBO_GR_UserReduceResultEX* pInfo = (DBO_GR_UserReduceResultEX*)pData; CGlobalUserItem *pCGlobalUserItem = m_GlobalInfoManager.SearchUserItemByUserID(pInfo->dwUserID); if (pCGlobalUserItem && pCGlobalUserItem->m_ServerID != 0) { int i = 0; CGlobalServerItem * p = pCGlobalUserItem->EnumServerItem(i); while (p) { if (p->GetServerID() == pCGlobalUserItem->m_ServerID) { //向最近登录的服务器,发送。 SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNBEANS_LOCK, pData, wDataSize); break; } i++; p = pCGlobalUserItem->EnumServerItem(i); } } return true; } case SUB_CS_C_USER_ENTER: //用户进入 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_UserEnter)); if (wDataSize != sizeof(CMD_CS_C_UserEnter)) return false; //消息处理 CMD_CS_C_UserEnter * pUserEnter = (CMD_CS_C_UserEnter *)pData; //pUserEnter->szNickName[CountArray(pUserEnter->szNickName) - 1] = 0; //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind == ServiceKind_Game); if (pBindParameter->ServiceKind != ServiceKind_Game) return false; //变量定义 tagGlobalUserInfo GlobalUserInfo; ZeroMemory(&GlobalUserInfo, sizeof(GlobalUserInfo)); //设置变量 GlobalUserInfo.dwUserID = pUserEnter->dwUserID; GlobalUserInfo.dwGameID = pUserEnter->dwGameID; //lstrcpyn(GlobalUserInfo.szNickName, pUserEnter->szNickName, CountArray(GlobalUserInfo.szNickName)); //辅助信息 GlobalUserInfo.cbGender = pUserEnter->cbGender; GlobalUserInfo.cbMemberOrder = pUserEnter->cbMemberOrder; GlobalUserInfo.cbMasterOrder = pUserEnter->cbMasterOrder; //激活用户 int result = m_GlobalInfoManager.ActiveUserItem(GlobalUserInfo, pBindParameter->wServiceID); if (result > 0) { //遍历节点 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL && pCGlobalServerItem->GetServerID() == result) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_DisCONN, &(GlobalUserInfo.dwUserID), sizeof(DWORD)); } } } //返回这个用户的创建房间列表 CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData(); JN_GR_RoomListGroup jnTemp; ZeroMemory(&jnTemp, sizeof(jnTemp)); if (pCMapRoomList->Lookup(GlobalUserInfo.dwUserID, jnTemp)) { JN_GR_RoomListGroupSend jnTempSend; ZeroMemory(&jnTempSend, sizeof(jnTempSend)); jnTempSend.Num = jnTemp.Num; for (int i = 0; i < (jnTemp.Num > 30 ? 30 : jnTemp.Num); i++) { CopyMemory(&(jnTempSend.jgrDate[i]), &(jnTemp.jgrDate[i]), sizeof(JN_GR_RoomList)); jnTempSend.jgrDate[i].tmp1 = jnTemp.jgrDate[i].bRoomCreatePay; jnTempSend.jgrDate[i].tmp2 = jnTemp.jgrDate[i].tmp1; jnTempSend.jgrDate[i].tmp3 = jnTemp.jgrDate[i].tmp2; } //拥有 if (jnTempSend.Num > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNROOMLIST, &jnTempSend, sizeof(JN_GR_RoomListGroupSend)); } //向所有服务器广播该玩家上线信息 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_ONLINE, pUserEnter, sizeof(CMD_CS_C_UserEnter)); } } return true; } case SUB_CS_C_USER_LEAVE: //用户离开 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_UserLeave)); if (wDataSize != sizeof(CMD_CS_C_UserLeave)) return false; //消息处理 CMD_CS_C_UserLeave * pUserLeave = (CMD_CS_C_UserLeave *)pData; //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind == ServiceKind_Game); if (pBindParameter->ServiceKind != ServiceKind_Game) return false; //删除用户 m_GlobalInfoManager.DeleteUserItem(pUserLeave->dwUserID, pBindParameter->wServiceID); //向所有服务器广播该玩家离线信息 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_C_USER_OFFLINE, pUserLeave, sizeof(CMD_CS_C_UserLeave)); } } return true; } case SUB_CS_C_USER_FINISH: //用户完成 { //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT((m_wCollectItem == wBindIndex) && (pBindParameter->ServiceKind == ServiceKind_Game)); if ((m_wCollectItem != wBindIndex) || (pBindParameter->ServiceKind != ServiceKind_Game)) return false; //设置变量 m_wCollectItem = INVALID_WORD; //汇总切换 if (m_WaitCollectItemArray.GetCount() > 0) { //切换汇总 INT_PTR nWaitCount = m_WaitCollectItemArray.GetCount(); m_wCollectItem = m_WaitCollectItemArray[nWaitCount - 1]; //删除数组 m_WaitCollectItemArray.RemoveAt(nWaitCount - 1); //发送消息 DWORD dwSocketIDTemp = (m_pBindParameter + m_wCollectItem)->dwSocketID; m_pITCPNetworkEngine->SendData(dwSocketIDTemp, MDM_CS_USER_COLLECT, SUB_CS_S_COLLECT_REQUEST); } return true; } case SUB_CS_C_USER_SERVER: ///---用户是否在游戏牌桌上的状态汇总 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_UserServer)); if (wDataSize != sizeof(CMD_CS_C_UserServer)) return false; //消息处理 CMD_CS_C_UserServer * pUserServer = (CMD_CS_C_UserServer *)pData; //获取参数 WORD wBindIndex = LOWORD(dwSocketID); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //连接效验 ASSERT(pBindParameter->ServiceKind == ServiceKind_Game); if (pBindParameter->ServiceKind != ServiceKind_Game) return false; //变量定义 CMD_CS_S_ServerUserInfo ServerUserInfo; ZeroMemory(&ServerUserInfo, sizeof(ServerUserInfo)); ServerUserInfo.dwUserID = pUserServer->dwUserID; if (pUserServer->cbFlag == 0) { ServerUserInfo.wServerID = 0; } else { ServerUserInfo.wServerID = pBindParameter->wServiceID; } m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_USER_INFO, &ServerUserInfo, sizeof(ServerUserInfo), 0L); return true; } case SUB_CS_UPDATAOWNROOM: //私人桌子更新 { //效验数据 ASSERT(wDataSize == sizeof(JN_GR_RoomListBig)); if (wDataSize != sizeof(JN_GR_RoomListBig)) return false; //消息处理 JN_GR_RoomListBig * pUserServer = (JN_GR_RoomListBig *)pData; int b = 0; if (pUserServer->dwInsert_UpData_Del == 0) ///---添加更新删除 0 , 1, 2 { CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom(); JN_GR_RoomListBig tempA; ZeroMemory(&tempA, sizeof(tempA)); tempA.InsertTime = GetTickCount(); pUserServer->InsertTime = GetTickCount(); if (!pCMapRoomListA->Lookup(pUserServer->dwRoomNumber, tempA)) { //CString csTest; //csTest.Format(_T("私有房间数目:%d,房间编号%d->新增"), pCMapRoomListA->GetSize() + 1, pUserServer->dwRoomNumber); //CTraceService::TraceString(csTest, TraceLevel_Normal); tempA = *pUserServer; pCMapRoomListA->SetAt(pUserServer->dwRoomNumber, tempA); //更新私有房间广播 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize); } } } //添加 CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData(); JN_GR_RoomListGroup temp; ZeroMemory(&temp, sizeof(temp)); pCMapRoomList->Lookup(pUserServer->dwUserID, temp); if (temp.Num < 10) { bool bFind = false; for (size_t i = 0; i <( temp.Num < 10 ? temp.Num: 10); i++) { if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber) { bFind = true; b = i; break; } } if (bFind) { temp.jgrDate[b] = *pUserServer; (*pCMapRoomList)[pUserServer->dwUserID] = temp; pUserServer->dwInsert_UpData_Del = 1; } else { temp.jgrDate[temp.Num] = *pUserServer; temp.Num++; (*pCMapRoomList)[pUserServer->dwUserID] = temp; } } } else if (pUserServer->dwInsert_UpData_Del == 1) { //更新 CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData(); JN_GR_RoomListGroup temp; ZeroMemory(&temp, sizeof(temp)); pCMapRoomList->Lookup(pUserServer->dwUserID, temp); for (size_t i = 0; i < (temp.Num < 10 ? temp.Num : 10); i++) { if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber) { temp.jgrDate[i] = *pUserServer; (*pCMapRoomList)[pUserServer->dwUserID] = temp; break; } } //更新私有房间广播 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize); } } } else { CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom(); JN_GR_RoomListBig tempA; ZeroMemory(&tempA, sizeof(tempA)); if (pCMapRoomListA->Lookup(pUserServer->dwRoomNumber, tempA)) { pCMapRoomListA->RemoveKey(pUserServer->dwRoomNumber); //CString csTest; //csTest.Format(_T("私有房间数目:%d,房间编号%d->销毁"), pCMapRoomListA->GetSize(), pUserServer->dwRoomNumber); //CTraceService::TraceString(csTest, TraceLevel_Normal); //更新私有房间广播 /*DWORD dPrivateRoom = 0; POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize); } }*/ } //无条件广播 POSITION Position = m_GlobalInfoManager.GetMapServerID()->GetStartPosition(); while (Position != NULL) { CGlobalServerItem *pCGlobalServerItem = NULL; WORD wID = 0; m_GlobalInfoManager.GetMapServerID()->GetNextAssoc(Position, wID, pCGlobalServerItem); if (pCGlobalServerItem != NULL) { SendDataToGame(pCGlobalServerItem->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, pData, wDataSize); } } //删除 CMapRoomList* pCMapRoomList = m_GlobalInfoManager.GetRoomData(); JN_GR_RoomListGroup temp; ZeroMemory(&temp, sizeof(temp)); pCMapRoomList->Lookup(pUserServer->dwUserID, temp); for (size_t i = 0; i < (temp.Num < 10 ? temp.Num : 10); i++) { if (temp.jgrDate[i].dwRoomNumber == pUserServer->dwRoomNumber) { temp.jgrDate[i] = temp.jgrDate[(temp.Num < 10 ? temp.Num : 10) - 1]; ZeroMemory(&(temp.jgrDate[temp.Num - 1]), sizeof(temp.jgrDate[temp.Num - 1])); if (temp.Num > 0) temp.Num--; if (temp.Num == 0) { //清除这个人的信息 pCMapRoomList->RemoveKey(pUserServer->dwUserID); } else { (*pCMapRoomList)[pUserServer->dwUserID] = temp; } break; } } } CGlobalUserItem * pUser = m_GlobalInfoManager.SearchUserItemByUserID(pUserServer->dwUserID); if (pUser) { int a = 0; CGlobalServerItem * p = pUser->EnumServerItem(a); while (p) { if (p->GetServerID() == pUser->m_ServerID) { //最近登录的服务器,发送。 SendDataToGame(p->GetServerID(), MDM_CS_USER_COLLECT, SUB_CS_UPDATAOWNROOM, pData, wDataSize); break; } a++; p = pUser->EnumServerItem(a); } } return true; } default: break; } return false; } //远程服务 bool CAttemperEngineSink::OnTCPNetworkMainRemoteService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_C_SEARCH_CORRESPOND: //协调查找 { //效验参数 ASSERT(wDataSize == sizeof(CMD_CS_C_SearchCorrespond)); if (wDataSize != sizeof(CMD_CS_C_SearchCorrespond)) return false; //处理消息 CMD_CS_C_SearchCorrespond * pSearchCorrespond = (CMD_CS_C_SearchCorrespond *)pData; pSearchCorrespond->szNickName[CountArray(pSearchCorrespond->szNickName) - 1] = 0; //变量定义 CMD_CS_S_SearchCorrespond SearchCorrespond; ZeroMemory(&SearchCorrespond, sizeof(SearchCorrespond)); //结果用户 CGlobalUserItem * ResultUserItem[2]; ZeroMemory(ResultUserItem, sizeof(ResultUserItem)); //设置变量 SearchCorrespond.dwSocketID = pSearchCorrespond->dwSocketID; SearchCorrespond.dwClientAddr = pSearchCorrespond->dwClientAddr; //查找用户 if (pSearchCorrespond->dwGameID != 0L) { ResultUserItem[0] = m_GlobalInfoManager.SearchUserItemByGameID(pSearchCorrespond->dwGameID); } //查找用户 //if (pSearchCorrespond->szNickName[0] != 0) //{ // _tcslwr(pSearchCorrespond->szNickName); //ResultUserItem[1] = m_GlobalInfoManager.SearchUserItemByNickName(pSearchCorrespond->szNickName); //} //设置结果 for (BYTE i = 0; i < CountArray(ResultUserItem); i++) { if (ResultUserItem[i] != NULL) { //变量定义 WORD wServerIndex = 0; //查找房间 do { //查找房间 CGlobalServerItem * pGlobalServerItem = ResultUserItem[i]->EnumServerItem(wServerIndex++); //终止判断 if (pGlobalServerItem == NULL) break; if (SearchCorrespond.wUserCount >= CountArray(SearchCorrespond.UserRemoteInfo)) break; //索引定义 WORD wIndex = SearchCorrespond.wUserCount++; //辅助信息 SearchCorrespond.UserRemoteInfo[wIndex].cbGender = ResultUserItem[i]->GetGender(); SearchCorrespond.UserRemoteInfo[wIndex].cbMemberOrder = ResultUserItem[i]->GetMemberOrder(); SearchCorrespond.UserRemoteInfo[wIndex].cbMasterOrder = ResultUserItem[i]->GetMasterOrder(); //用户信息 SearchCorrespond.UserRemoteInfo[wIndex].dwUserID = ResultUserItem[i]->GetUserID(); SearchCorrespond.UserRemoteInfo[wIndex].dwGameID = ResultUserItem[i]->GetGameID(); //lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szNickName, ResultUserItem[i]->GetNickName(), LEN_NICKNAME); //房间信息 SearchCorrespond.UserRemoteInfo[wIndex].wKindID = pGlobalServerItem->GetKindID(); SearchCorrespond.UserRemoteInfo[wIndex].wServerID = pGlobalServerItem->GetServerID(); lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szGameServer, pGlobalServerItem->m_GameServer.szServerName, LEN_SERVER); } while (true); } } //发送数据 WORD wHeadSize = sizeof(SearchCorrespond) - sizeof(SearchCorrespond.UserRemoteInfo); WORD wItemSize = sizeof(SearchCorrespond.UserRemoteInfo[0])*SearchCorrespond.wUserCount; m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_REMOTE_SERVICE, SUB_CS_S_SEARCH_CORRESPOND, &SearchCorrespond, wHeadSize + wItemSize); return true; } default: break; } return false; } //管理服务 bool CAttemperEngineSink::OnTCPNetworkMainManagerService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_C_SYSTEM_MESSAGE: //系统消息 { //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_SYSTEM_MESSAGE, pData, wDataSize, 0L); return true; } case SUB_CS_C_PROPERTY_TRUMPET: //喇叭消息 { //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_PROPERTY_TRUMPET, pData, wDataSize, 0L); return true; } case SUB_CS_C_TELL_CORRESPOND: //服务器发来的心跳 { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_TellCorr)); if (wDataSize != sizeof(CMD_CS_C_TellCorr)) return false; //消息定义 CMD_CS_C_TellCorr * pTellCorr = (CMD_CS_C_TellCorr *)pData; //获取对象 CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pTellCorr->wServerID); if (pGlobalServerItem != NULL) { pGlobalServerItem->m_GameServer.dwLiveTime = (DWORD)time(NULL); CString str; str.Format(TEXT("服务器%d 心跳时间[%d]"), pGlobalServerItem->GetServerID(), pGlobalServerItem->m_GameServer.dwLiveTime); CCorrespondServerDlg* pCCorrespondServerDlg = (CCorrespondServerDlg*)theApp.m_pMainWnd; pCCorrespondServerDlg->aa.SetWindowTextW(str);; ///CTraceService::TraceString(str, TraceLevel_Normal); } else { //为空则该服务器已经被清空。断开连接。回一个非法包 m_pITCPNetworkEngine->CloseSocket(dwSocketID); //m_pITCPNetworkEngine->ShutDownSocket(dwSocketID); //WORD wPacketSize = pHead->TCPInfo.wPacketSize; //if (wPacketSize > SOCKET_TCP_BUFFER) throw TEXT("数据包超长"); //if (wPacketSize < sizeof(TCP_Head)) throw TEXT("数据包非法"); //if (m_wRecvSize < wPacketSize) break; } return true; } ///[---add by yd case SUB_CS_C_LOGON_HEARTBEAT: // 收到登录服务器的心跳包,更新LogonServer心跳时间 { ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterPlaza)); if (wDataSize != sizeof(CMD_CS_C_RegisterPlaza)) { return false; } //消息定义 //WORD * pwServerID = (WORD *)pData; ////获取对象 //CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItemByServerID(*pwServerID); CMD_CS_C_RegisterPlaza * pRegisterPlaza = (CMD_CS_C_RegisterPlaza *)pData; //变量定义 tagGamePlaza GamePlaza; ZeroMemory(&GamePlaza, sizeof(GamePlaza)); //构造数据 //GamePlaza.wPlazaID = wBindIndex; //lstrcpyn(GamePlaza.szServerName, pRegisterPlaza->szServerName, CountArray(GamePlaza.szServerName)); //lstrcpyn(GamePlaza.szServerAddr, pRegisterPlaza->szServerAddr, CountArray(GamePlaza.szServerAddr)); //GamePlaza.wServerID = pRegisterPlaza->wServerID; //GamePlaza.dwLiveTime = GetTickCount();///(DWORD)time(NULL); //m_GlobalInfoManager.ActivePlazaItem(wBindIndex, GamePlaza); //获取对象 //CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItemByServerID(GamePlaza.wServerID); CGlobalPlazaItem * pGlobalServerItem = m_GlobalInfoManager.SearchPlazaItem(pRegisterPlaza->wServerID); if (pGlobalServerItem != NULL) { ///---更新当前登录服务器的心跳时间 pGlobalServerItem->m_GamePlaza.dwLiveTime = GetTickCount();///(DWORD)time(NULL); CString str; str.Format(TEXT("***登录服务器%d 心跳时间[%d]"), pGlobalServerItem->GetPlazaServerID(), pGlobalServerItem->m_GamePlaza.dwLiveTime); CCorrespondServerDlg* pCCorrespondServerDlg = (CCorrespondServerDlg*)theApp.m_pMainWnd; pCCorrespondServerDlg->aa.SetWindowTextW(str); //CTraceService::TraceString(str, TraceLevel_Normal); ///---回一个心跳包 m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_MANAGER_SERVICE, SUB_CS_C_LOGON_HEARTBEAT, pData, wDataSize); } else { ASSERT(FALSE); CString str; str.Format(TEXT("***未找到此登录服务器, wServerID=%d 心跳未发送"), pRegisterPlaza->wServerID); CTraceService::TraceString(str, TraceLevel_Normal); } return true; } default: break; ///---] } return false; } //机器服务 //bool CAttemperEngineSink::OnTCPNetworkMainAndroidService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) //{ // switch (wSubCmdID) // { // case SUB_CS_C_ADDPARAMETER: //添加参数 // { // //参数校验 // ASSERT(sizeof(CMD_CS_C_AddParameter) == wDataSize); // if (sizeof(CMD_CS_C_AddParameter) != wDataSize) return false; // // //提取数据 // CMD_CS_C_AddParameter * pAddParameter = (CMD_CS_C_AddParameter *)pData; // // //构造结构 // CMD_CS_S_AddParameter AddParameter; // CopyMemory(&AddParameter.AndroidParameter, &pAddParameter->AndroidParameter, sizeof(tagAndroidParameter)); // // //发送消息 // SendDataToGame(pAddParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_ADDPARAMETER, &AddParameter, sizeof(AddParameter)); // // return true; // } // case SUB_CS_C_MODIFYPARAMETER: //修改参数 // { // //参数校验 // ASSERT(sizeof(CMD_CS_C_ModifyParameter) == wDataSize); // if (sizeof(CMD_CS_C_ModifyParameter) != wDataSize) return false; // // //提取数据 // CMD_CS_C_ModifyParameter * pModifyParameter = (CMD_CS_C_ModifyParameter *)pData; // // //构造结构 // CMD_CS_S_ModifyParameter ModifyParameter; // CopyMemory(&ModifyParameter.AndroidParameter, &pModifyParameter->AndroidParameter, sizeof(tagAndroidParameter)); // // //发送通知 // SendDataToGame(pModifyParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_MODIFYPARAMETER, &ModifyParameter, sizeof(ModifyParameter)); // // return true; // } // case SUB_CS_C_DELETEPARAMETER: //删除参数 // { // //参数校验 // ASSERT(sizeof(CMD_CS_C_DeleteParameter) == wDataSize); // if (sizeof(CMD_CS_C_DeleteParameter) != wDataSize) return false; // // //提取数据 // CMD_CS_C_DeleteParameter * pDeleteParameter = (CMD_CS_C_DeleteParameter *)pData; // // //构造结构 // CMD_CS_S_DeleteParameter DeleteParameter; // DeleteParameter.dwBatchID = pDeleteParameter->dwBatchID; // // //发送通知 // SendDataToGame(pDeleteParameter->wServerID, MDM_CS_ANDROID_SERVICE, SUB_CS_S_DELETEPARAMETER, &DeleteParameter, sizeof(DeleteParameter)); // // return true; // } // default: break; // } // // return false; //} //发送私人房间列表总会 bool CAttemperEngineSink::SendPrivateListItem(DWORD dwSocketID) { //变量定义 CPrivateRoomList* pCMapRoomListA = m_GlobalInfoManager.GetPrivateRoom(); ///---JN_GR_RoomListBig tempA; ///---ZeroMemory(&tempA, sizeof(tempA)); POSITION Position = pCMapRoomListA->GetStartPosition(); while (Position != NULL) { JN_GR_RoomListBig Temp; ZeroMemory(&Temp, sizeof(JN_GR_RoomListBig)); DWORD dwRoomNumber = 0; pCMapRoomListA->GetNextAssoc(Position, dwRoomNumber, Temp); m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_USER_COLLECT, SUB_CS_UPDATAOTHERROOM, &Temp, sizeof(JN_GR_RoomListBig)); } return true; } //发送列表 bool CAttemperEngineSink::SendServerListItem(DWORD dwSocketID) { //变量定义 WORD wPacketSize = 0L; POSITION Position = NULL; BYTE cbBuffer[SOCKET_TCP_PACKET]; //发送信息 m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INFO); //收集数据 do { //发送数据 if ((wPacketSize + sizeof(tagGameServer)) > sizeof(cbBuffer)) { m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INSERT, cbBuffer, wPacketSize); wPacketSize = 0; } //获取对象 tagGameServer * pGameServer = (tagGameServer *)(cbBuffer + wPacketSize); CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position); //设置数据 if (pGlobalServerItem != NULL) { wPacketSize += sizeof(tagGameServer); CopyMemory(pGameServer, &pGlobalServerItem->m_GameServer, sizeof(tagGameServer)); } } while (Position != NULL); //发送数据 if (wPacketSize > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_INSERT, cbBuffer, wPacketSize); //发送完成 m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_SERVER_FINISH); return true; } //发送列表 bool CAttemperEngineSink::SendMatchListItem(DWORD dwSocketID) { //变量定义 WORD wPacketSize = 0L; POSITION Position = NULL; BYTE cbBuffer[SOCKET_TCP_PACKET]; //收集数据 do { //发送数据 if ((wPacketSize + sizeof(tagGameServer)) > sizeof(cbBuffer)) { m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_MATCH_INSERT, cbBuffer, wPacketSize); wPacketSize = 0; } //获取对象 tagGameMatch * pGameMatch = (tagGameMatch *)(cbBuffer + wPacketSize); CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.EnumServerItem(Position); //设置数据 if (pGlobalServerItem != NULL && pGlobalServerItem->IsMatchServer()) { wPacketSize += sizeof(tagGameMatch); CopyMemory(pGameMatch, &pGlobalServerItem->m_GameMatch, sizeof(tagGameMatch)); } } while (Position != NULL); //发送数据 if (wPacketSize > 0) m_pITCPNetworkEngine->SendData(dwSocketID, MDM_CS_SERVICE_INFO, SUB_CS_S_MATCH_INSERT, cbBuffer, wPacketSize); return true; } //房间发送 bool CAttemperEngineSink::SendDataToGame(WORD wServerID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { //查找房间 CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(wServerID); if (pGlobalServerItem == NULL) return false; //获取参数 WORD wBindIndex = pGlobalServerItem->GetIndex(); tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //发送数据 DWORD dwSocketID = pBindParameter->dwSocketID; m_pITCPNetworkEngine->SendData(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize); return true; } //////////////////////////////////////////////////////////////////////////////////