#include "StdAfx.h" #include "ServiceUnits.h" #include "ControlPacket.h" #include "AttemperEngineSink.h" ////////////////////////////////////////////////////////////////////////////////// //构造函数 CAttemperEngineSink::CAttemperEngineSink() { //状态变量 m_wCollectItem=INVALID_WORD; //设置变量 m_pInitParameter=NULL; m_pBindParameter=NULL; //组件变量 m_pITimerEngine=NULL; m_pITCPNetworkEngine=NULL; 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); 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(); return true; } //控制事件 bool CAttemperEngineSink::OnEventControl(WORD wIdentifier, VOID * pData, WORD wDataSize) { switch (wIdentifier) { case CT_MAINTAIN_SERVICE: { //效验参数 ASSERT(wDataSize == sizeof(BYTE)); if (wDataSize != sizeof(BYTE)) return false; BYTE cbFlag = *(BYTE*)pData; return true; } case CT_SEND_SYSTEM_MESSAGE: { //效验参数 ASSERT(wDataSize == sizeof(CMD_CM_SystemMessage)); if (wDataSize != sizeof(CMD_CM_SystemMessage)) return false; CMD_CM_SystemMessage* pMessage = (CMD_CM_SystemMessage*)pData; //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_GAME_MESSAGE, pData, wDataSize, 0L); return true; } } return false; } //调度事件 bool CAttemperEngineSink::OnEventAttemperData(WORD wRequestID, VOID * pData, WORD wDataSize) { return false; } //时间事件 bool CAttemperEngineSink::OnEventTimer(DWORD dwTimerID, WPARAM wBindParam) { return false; } //应答事件 bool CAttemperEngineSink::OnEventTCPNetworkBind(DWORD dwClientAddr, DWORD dwSocketID) { //获取索引 ASSERT(LOWORD(dwSocketID)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_WEB_SERVICE: //网站网关服务 { return OnTCPNetworkMainWebService(Command.wSubCmdID, pData, wDataSize, dwSocketID); } } return false; } //关闭事件 bool CAttemperEngineSink::OnEventTCPNetworkShut(DWORD dwClientAddr, DWORD dwActiveTime, DWORD dwSocketID) { //获取信息 WORD wBindIndex=LOWORD(dwSocketID); tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex); //游戏服务 if (pBindParameter->ServiceKind==ServiceKind_Game) { //变量定义 WORD wBindIndex=LOWORD(dwSocketID); //汇总处理 if (wBindIndex==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 dwSocketID=(m_pBindParameter+m_wCollectItem)->dwSocketID; m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_USER_COLLECT,SUB_CS_S_COLLECT_REQUEST); } } else { //删除等待 for (INT_PTR i=0;iwServiceID; m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_REMOVE,&ServerRemove,sizeof(ServerRemove),0L); //注销房间 m_GlobalInfoManager.DeleteServerItem(pBindParameter->wServiceID); } //广场服务 if (pBindParameter->ServiceKind==ServiceKind_Plaza) { //变量定义 WORD wBindIndex=LOWORD(dwSocketID); tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex); //注销房间 m_GlobalInfoManager.DeletePlazaItem(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=wBindIndex; (m_pBindParameter+wBindIndex)->ServiceKind=ServiceKind_Plaza; //变量定义 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)); //注册房间 m_GlobalInfoManager.ActivePlazaItem(wBindIndex,GamePlaza); //发送列表 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_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; lstrcpyn(GameServer.szServerName,pRegisterServer->szServerName,CountArray(GameServer.szServerName)); lstrcpyn(GameServer.szServerAddr,pRegisterServer->szServerAddr,CountArray(GameServer.szServerAddr)); //注册房间 m_GlobalInfoManager.ActiveServerItem(wBindIndex,GameServer); //群发房间 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_INSERT,&GameServer,sizeof(GameServer),0L); //发送列表 SendServerListItem(dwSocketID); SendMatchListItem(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); 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.lMatchEnterScore = pRegisterMatch->lMatchEnterScore; 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; GameMatch.SignupStartTime = pRegisterMatch->SignupStartTime; GameMatch.SignupEndTime = pRegisterMatch->SignupEndTime; GameMatch.dwQuality = pRegisterMatch->dwQuality; GameMatch.dwCycle = pRegisterMatch->dwCycle; GameMatch.dwInviteCode = pRegisterMatch->dwInviteCode; GameMatch.dwChannelID = pRegisterMatch->dwChannelID; 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; } case SUB_CS_C_REGISTER_WEBGATE: { //效验数据 ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterWebGate)); if (wDataSize != sizeof(CMD_CS_C_RegisterWebGate)) return false; CMD_CS_C_RegisterWebGate* pWebGate = (CMD_CS_C_RegisterWebGate*)pData; return true; } } return false; } //服务状态 bool CAttemperEngineSink::OnTCPNetworkMainServiceInfo(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { 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; //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_ONLINE,&ServerOnLine,sizeof(ServerOnLine),0L); } 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.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.dwOnLineCount=pServerModify->dwOnLineCount; 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; } } return false; } //用户处理 bool CAttemperEngineSink::OnTCPNetworkMainUserCollect(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { 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; //激活用户 m_GlobalInfoManager.ActiveUserItem(GlobalUserInfo,pBindParameter->wServiceID); 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); 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 dwSocketID=(m_pBindParameter+m_wCollectItem)->dwSocketID; m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_USER_COLLECT,SUB_CS_S_COLLECT_REQUEST); } return true; } } 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;iEnumServerItem(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; } } 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; } } return false; } //网站网关服务 bool CAttemperEngineSink::OnTCPNetworkMainWebService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_CS_C_SET_CHEAT_USER: { //发送通知 m_pITCPNetworkEngine->SendDataBatch(MDM_CS_WEB_SERVICE, SUB_CS_S_SET_CHEAT_USER, pData, wDataSize, 0L); return true; } case SUB_CS_C_SET_CARD_LIB: { //效验参数 ASSERT(wDataSize == sizeof(CMD_CS_SetCardLib)); if (wDataSize != sizeof(CMD_CS_SetCardLib)) return false; CMD_CS_SetCardLib* pCardLib = (CMD_CS_SetCardLib*)pData; SendDataToKindGame(pCardLib->wKindID, MDM_CS_WEB_SERVICE, SUB_CS_S_SET_CARD_LIB, pData, wDataSize); return true; } case SUB_CS_C_CARD_LIB_GLOBAL_CFG: { //效验参数 ASSERT(wDataSize == sizeof(CMD_CS_CardLibGlobalCfg)); if (wDataSize != sizeof(CMD_CS_CardLibGlobalCfg)) return false; CMD_CS_CardLibGlobalCfg* pCardLib = (CMD_CS_CardLibGlobalCfg*)pData; SendDataToKindGame(pCardLib->wKindID, MDM_CS_WEB_SERVICE, SUB_CS_S_CARD_LIB_GLOBAL_CFG, pData, wDataSize); return true; } default: break; } return false; } //发送列表 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::SendDataToKindGame(WORD wKindID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { POSITION Position = NULL; //收集数据 do { //获取对象 CGlobalServerItem * pServerItem = m_GlobalInfoManager.EnumServerItem(Position); //设置数据 if (pServerItem == NULL || pServerItem->GetKindID() != wKindID) { continue; } //获取参数 WORD wBindIndex = pServerItem->GetIndex(); ASSERT(wBindIndex < m_pInitParameter->m_wMaxConnect); if (wBindIndex >= m_pInitParameter->m_wMaxConnect) { continue; } tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex); //发送数据 DWORD dwSocketID = pBindParameter->dwSocketID; m_pITCPNetworkEngine->SendData(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize); } while (Position != NULL); 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; } //用户发送 bool CAttemperEngineSink::SendDataToUser(WORD wServerID, DWORD dwUserID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { return true; } //////////////////////////////////////////////////////////////////////////////////