




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十二章補(bǔ)充具體程序main.cpp/ 因?yàn)镈BS是運(yùn)行于linux環(huán)境下的,所以main函數(shù)是console的形式CGWSMgr g_GWSMgr; / 定義一個(gè)全局GameWorldServer管理類實(shí)例int main(int argc, char* argv) LOG(LV_M, "DBServer Start .");if(!g_GWSMgr.Init() / 執(zhí)行CGWSMgr的Init函數(shù)來初始化有關(guān)數(shù)據(jù),建立監(jiān)聽socket等return 0;int bRun = 1;while(bRun) / 執(zhí)行CGWSMgr的Run函數(shù)來進(jìn)行DBS的主體循環(huán)處理 bR
2、un = g_GWSMgr.Run();LOG(LV_M , "DBServer Exit !");return 0;gws.h/ 下面定義游戲用到的數(shù)據(jù)表名static const char CHARACTER_TB = "cha_tb" / 角色表static const char ITEM_TB = "item_tb" / 道具表static const char MAIL_TB = "mail_tb" / 郵件表/ DBS自身基于來自Packet消息的調(diào)用, 這里的packet只是數(shù)據(jù)存放使用,并不一定來自
3、網(wǎng)絡(luò)消息/之所以這樣存放,是為了解析此類消息的時(shí)候,與解析網(wǎng)絡(luò)消息的形式以及格式保持一致enum DBS_MSG _DBS_MSG_BASE = 5000, DBS_FACTION_CAL_EXP / 計(jì)算幫派總經(jīng)驗(yàn)值的消息,是定時(shí)觸發(fā)的;/ 代表單個(gè)GWS的類CGWSclass CGWSprivate: int _nID; / 預(yù)先分配好的ID, 在GWS登錄DBS以后會(huì)賦值 int _nState; map<int , CGamePlayer*> _PlayerIdx; / 玩家ID到數(shù)據(jù)指針的映射,方便查找public:CGWS();CGWS();CMFTCPSession
4、*m_Link; / 用來保持和GWS連接的socket/ 下面是一些對(duì)Player數(shù)據(jù)的操作函數(shù)void SetID(int nID); int GetID(); void SetState(int nState); void AddPlayer(CGamePlayer *pPlayer); bool RemovePlayer(int nID); void ClearPlayerList(); CGamePlayer* CheckPlayerOnline(int nID); CGamePlayer* GetPlayer(int nID);/ 處理來自GWS的命令的統(tǒng)一的函數(shù)定義, 參數(shù)固定為
5、2個(gè), 1是GWS的指針, 標(biāo)識(shí)消息來自于誰/ 2是數(shù)據(jù)包的packet指針,內(nèi)含數(shù)據(jù)實(shí)際內(nèi)容, 對(duì)于數(shù)據(jù)庫服務(wù)器這樣的應(yīng)用程序,很適合使用類/ 似的函數(shù)定義方法來統(tǒng)一處理消息, 可以使代碼結(jié)構(gòu)清晰, 功能明確, 還可以方便的統(tǒng)計(jì)函數(shù)的/ 執(zhí)行時(shí)間以評(píng)估對(duì)數(shù)據(jù)庫操作的性能typedef void (*GWS2DBSPROC)(CGWS *pGWS, CMFCmdPacket *pPacket);/ 管理所有連接上DBS的GWS的類CGWSMgr/ 也是最大,最關(guān)鍵的一個(gè)類,它控制了整個(gè)程序的運(yùn)行流程/ 此類里面包含了很多static的變量和函數(shù), 主要是基于用消息觸發(fā)回調(diào)函數(shù)的需要, / 因?yàn)?/p>
6、回調(diào)函數(shù)只能是全局的,如果想包含在類里面,就必須是static類型,它能存取/ 的變量也必須是static類型class CGWSMgrprivate: static CLog* _pL; static CDBMySql _DB; / 這是負(fù)責(zé)存取數(shù)據(jù)庫的一個(gè)MySql接口類的實(shí)例 / 下面定義一些字符串?dāng)?shù)組, 作為生成以及存放sql語句字段,條件等等的公用內(nèi)存static string _strSQL; static char _szSQL32768; static char _szCon256; static char _szField32; static char _szBuf4096;
7、 static list<CGWS*> _GWSList; / 所有連接上來的GWS的列表 list<CGWS*> _DeadList; / 記錄當(dāng)前失去連接的GWS static CMFCmdPacket _SendCmd; / 發(fā)送消息時(shí)使用的一個(gè)公有packet數(shù)據(jù)包內(nèi)存 CMFCmdPacket _RecvCmd; / 接受消息時(shí)使用的一個(gè)公有packet數(shù)據(jù)包內(nèi)存 int _nRunCnt; / DBServer循環(huán)計(jì)數(shù)/ 消息處理函數(shù), 所有的網(wǎng)絡(luò)消息以及DBS內(nèi)部消息都調(diào)用它來處理void _HandleCmd(CGWS *pGWS, CMFCmdPack
8、et *pCmd);struct SProcess / 消息處理函數(shù)信息, 記錄函數(shù)指針,標(biāo)識(shí)函數(shù)的字符串名字,以及函數(shù)執(zhí)行時(shí)間的記錄 char szName24; / 名字 int nTimeCnt; / 耗時(shí)累計(jì) GWS2DBSPROC pfn; / 函數(shù) ; map<short, SProcess> _ProcessList; / 從消息類型定義到處理函數(shù)的指針的映射/ 添加一個(gè)新的消息處理函數(shù) void _AddProcess(short sMsgType, GWS2DBSPROC pfn , char *pszName = NULL); / 下面列出的就是由消息觸發(fā)的回調(diào)
9、函數(shù)指針, 它們的格式是完全統(tǒng)一的, / 由函數(shù)的名字也可以大致知道它的作用, 后面我們會(huì)列出部分很典型的函數(shù)內(nèi)容來介紹 static void _HandleCmd_GWSLogin(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_CreateCha(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_CreatePet(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_SaveCha(CGWS *pG
10、WS , CMFCmdPacket *pCmd); static void _HandleCmd_QueryActCha(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_QueryCha(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_DeleteCha(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_UserEnter(CGWS *pGWS , CMFCmdPacket*pCmd); static
11、 void _HandleCmd_UserLeave(CGWS *pGWS , CMFCmdPacket*pCmd); static void _HandleCmd_CreateFaction(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_DeleteFaction(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_QueryFactionList(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_U
12、pdateFaction(CGWS *pGWS, CMFCmdPacket *pCmd); static void _HandleCmd_FactionApply(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_ChangeFactionLeader(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_QueryFactionMemberList(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_Quer
13、yFactionByID(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_FactionAccept(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_FactionLeave(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_FactionQuit(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_FactionCalExp(CGWS *
14、pGWS, CMFCmdPacket *pCmd); static void _HandleCmd_CreateItem(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_DeleteItem(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_CreateMail(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_DeleteMail(CGWS *pGWS , CMFCmdPacket *pCmd); s
15、tatic void _HandleCmd_QueryMail(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_RefreshFriendList(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_GWSProxy(CGWS *pGWS , CMFCmdPacket *pCmd); static void _HandleCmd_SQLProxy(CGWS *pGWS, CMFCmdPacket *pCmd); / 公用的發(fā)送packet函數(shù) static void
16、_SendMsg(CMFCmdPacket *pCmd , CGWS *pGWS = NULL , bool bExcept = false, bool bEndWrite = true); static void _NewPacket(short sMsgType); / packet操作實(shí)用函數(shù),用指定的消息開始一個(gè)packet / 下面有一些封裝和簡(jiǎn)化SQL操作的實(shí)用函數(shù)static bool _RunSQL(const char *pszSQL, bool bShow = false); / 執(zhí)行指定SQL語句的函數(shù)/ 根據(jù)指定條件, 對(duì)指定數(shù)據(jù)表查詢并返回符合條件的記錄數(shù)量stati
17、c long _SQLGetCount(const char *pszTable, const char *pszCon); / 針對(duì)幫派這種跨多個(gè)GWS的游戲內(nèi)容的處理static int _nFactionCheckTick; / 檢查幫派數(shù)據(jù)的時(shí)間計(jì)數(shù) static float _fFactionCheckInterval; / 時(shí)間間隔 static void _CheckFactionValid(); / 檢查已經(jīng)無效的幫派并作相應(yīng)處理 static int _nCalFactionExpTick; / 幫派總經(jīng)驗(yàn)值計(jì)算的時(shí)間計(jì)數(shù) static float _fCalFactionE
18、xpInterval; / 時(shí)間間隔 public: / 有關(guān)數(shù)據(jù)庫備份的處理static int m_nBackupHour; / 備份時(shí)間static int m_nBackupMin; static void DoBackup(int nWeekday);/ 執(zhí)行備份操作static void CheckBackup(); / 檢查時(shí)間public:CGWSMgr();CGWSMgr();CMFNetSocket m_ListenSock; / 用來監(jiān)聽的socketbool Init(); / 初試化int Run(); / 主體循環(huán)bool AddGWS(CGWS *pGWS); /
19、 添加新的GWS/ 下面是數(shù)據(jù)包packet解析和sql語句之間的轉(zhuǎn)換函數(shù) / 把一個(gè)packet包含的數(shù)據(jù)轉(zhuǎn)化為一條SQL insert語句static void Util_Packet2SQL_Insert(CMFCmdPacket *pCmd, string &strSQL, char *pszField = NULL,char *pszValue = NULL); / 把一個(gè)packet包含的數(shù)據(jù)轉(zhuǎn)化為一條SQL update語句static void Util_Packet2SQL_Update(CMFCmdPacket *pCmd, string &strCmd,
20、char *pszCon, const char* pszTab);/ 把一個(gè)字段的名字,數(shù)據(jù)類型,數(shù)據(jù)值寫入指定的packetstatic void Util_Field2Packet(char *pszName, int nType, char *pszValue, CMFCmdPacket *pCmd); / 從packet里讀出一個(gè)字段信息static void Util_GetFieldValue(CMFCmdPacket *pCmd, string &strValue); / 寫入當(dāng)前的字段列表(字段名字)到packet static void Util_FieldList
21、2Packet(int nFieldCnt, CMFCmdPacket *pCmd); / 讀出當(dāng)前數(shù)據(jù)表的記錄,寫入packetstatic void Util_SQLData2Packet(CMFCmdPacket *pCmd);inline void CGWSMgr:_NewPacket(short sMsgType) _SendCmd.BeginWrite(); _SendCmd.WriteShort(sMsgType);/ 添加消息處理函數(shù)inline void CGWSMgr:_AddProcess(short sMsgType, GWS2DBSPROC pfn, char *ps
22、zName) SProcess p; p.nTimeCnt = 0; p.pfn = pfn; if(pszName=NULL) strcpy(p.szName , ""); else strcpy(p.szName , pszName); _ProcessListsMsgType = p;/ 建立從消息類型到處理函數(shù)指針的映射gws.cpp#ifdef LINUXvoid pfnBackupRoutine(int nSig) / 在linux下,用一個(gè)系統(tǒng)定時(shí)信號(hào)來觸發(fā)數(shù)據(jù)庫備份操作 if(nSig=SIGALRM) / printf("Receive Back
23、up Signal %dn", nSig); g_GWSMgr.CheckBackup(); #endif/ 下面是class CGWS的實(shí)現(xiàn)CGWS:CGWS() _nID = 0; m_Link = NULL;CGWS:CGWS() if(m_Link) delete m_Link;/ 添加新的玩家到GWS的列表void CGWS:AddPlayer(CGamePlayer *pPlayer)_PlayerIdxpPlayer->Info.nChaID = pPlayer; / 建立從玩家ID到玩家數(shù)據(jù)的映射, 在DBS里,/ 所需要玩家的數(shù)據(jù)實(shí)際上很少,僅僅是角色I(xiàn)D,
24、賬號(hào)ID,是否在線等簡(jiǎn)單的幾項(xiàng)數(shù)據(jù)而已/ 從GWS的玩家列表中刪掉bool CGWS:RemovePlayer(int nID) map<int, CGamePlayer*>:iterator it = _PlayerIdx.find(nID); if(it!=_PlayerIdx.end() CGamePlayer *pPlayer = (*it).second; delete pPlayer; _PlayerIdx.erase(it); return true; return false;/ 檢查某個(gè)ID的玩家是否在線CGamePlayer* CGWS:CheckPlayerO
25、nline(int nID) return GetPlayer(nID);/ 由ID取得玩家數(shù)據(jù)CGamePlayer* CGWS:GetPlayer(int nID) map<int, CGamePlayer*>:iterator it = _PlayerIdx.find(nID); if(it!=_PlayerIdx.end() return (*it).second; return NULL;/ 清空玩家列表void CGWS:ClearPlayerList() for(map<int, CGamePlayer*>:iterator it = _PlayerIdx
26、.begin(); it!=_PlayerIdx.end(); it+) CGamePlayer *pPlayer = (*it).second; delete pPlayer; _PlayerIdx.clear();/ 下面是class CGWSMgr的實(shí)現(xiàn)CGWSMgr:CGWSMgr() _nFactionCheckTick = 0; _fFactionCheckInterval = 60.0f * 6.0f; / 以分鐘為單位, 6個(gè)小時(shí)檢查一次 _nCalFactionExpTick = 0; _fCalFactionExpInterval= 30.0f; / 每30分鐘計(jì)算一次 m
27、_nBackupHour = 6; m_nBackupMin = 0;/ DBS初試化操作, 讀取配置文件, 建立數(shù)據(jù)庫連接, 開始監(jiān)聽等等bool CGWSMgr:Init() string strLogName = Util_CurTime2String(1); _pL = g_LogMgr.Add(strLogName.c_str(); / 讀取配置文件, 取得梆定IP和端口等運(yùn)行DBSA所需的配置信息 if(!_TextLoader.OpenFile("config.txt") LOG(LV_H, "Open Config Txt Failed! , Ex
28、it!"); return false; _pL->L("load config : okn"); const char *pszDBIP = _TextLoader.GetNode("db_host_ip"); const char *pszBindIP = _TextLoader.GetNode("db_bind_ip"); const char *pszDBPort = _TextLoader.GetNode("db_host_port"); const char *pszDBName = _
29、TextLoader.GetNode("db_name"); const char *pszUser = _TextLoader.GetNode("db_username"); const char *pszPass = _TextLoader.GetNode("db_password"); const char *pszPort = _TextLoader.GetNode("listen_port"); / 與數(shù)據(jù)庫建立連接 if(!_DB.Connect(pszDBIP, atoi(pszDBPort), ps
30、zUser, pszPass, pszDBName) LOG(LV_H , "ERR : Connect DB Failed!"); return false; LOG(LV_M , "Connect DB Successful!"); _pL->L("connect db : okn"); / 建立監(jiān)聽端口if(!m_ListenSock.Initialize(PROTOCOL_TCP, (char*)pszBindIP, atoi(pszPort),true) LOG(LV_H , "ListenSock Init
31、 Failed!"); return false; m_ListenSock.Listen(); char szLocalIP255; unsigned long dwIP; char cMark; m_ListenSock.GetLocalAddr(szLocalIP , &dwIP , &cMark); _pL->L("Begin Listening . , IP = %s , Port = %dn", szLocalIP, 7812); / 下面就是建立各類消息與其對(duì)應(yīng)的處理函數(shù)的聯(lián)系, 并賦與一個(gè)字符串名字,以方便調(diào)試和察看_AddP
32、rocess(GWS2DBS_PROXY_PACKET , _HandleCmd_GWSProxy , "GWS_PROXY"); _AddProcess(GWS2DBS_PROXY_SQL , _HandleCmd_SQLProxy , "SQL_PROXY"); _AddProcess(GWS2DBS_LOGIN , _HandleCmd_GWSLogin , "GWS_LOGIN"); _AddProcess(GWS2DBS_CREATE_CHAR , _HandleCmd_CreateCha , "CREATE_CH
33、A"); _AddProcess(GWS2DBS_QUERY_ACT_CHAR , _HandleCmd_QueryActCha , "QUERY_ACT_CHA"); _AddProcess(GWS2DBS_QUERY_CHAR , _HandleCmd_QueryCha , "QUERY_CHA"); _AddProcess(GWS2DBS_DELETE_CHAR , _HandleCmd_DeleteCha , "DELETE_CHA"); _AddProcess(GWS2DBS_CREATE_ITEM , _Hand
34、leCmd_CreateItem , "CREATE_ITEM"); _AddProcess(GWS2DBS_SAVE_CHAR , _HandleCmd_SaveCha , "SAVE_CHA"); _AddProcess(GWS2DBS_USER_ENTER , _HandleCmd_UserEnter , "USER_ENTER"); _AddProcess(GWS2DBS_USER_LEAVE , _HandleCmd_UserLeave , "USER_LEAVE"); _AddProcess(GWS2D
35、BS_FACTION_CREATE , _HandleCmd_CreateFaction , "FA_CREATE"); _AddProcess(GWS2DBS_FACTION_GET_FACTION_LIST, _HandleCmd_QueryFactionList , "FA_QUERY_LIST"); _AddProcess(GWS2DBS_FACTION_DISMISS , _HandleCmd_DeleteFaction , "FA_DELETE"); _AddProcess(GWS2DBS_FACTION_UPDATE ,
36、 _HandleCmd_UpdateFaction , "FA_UPDATE"); _AddProcess(GWS2DBS_FACTION_CHANGE_LEADER , _HandleCmd_ChangeFactionLeader , "FA_CHANGE_LEADER"); _AddProcess(GWS2DBS_FACTION_APPLY , _HandleCmd_FactionApply , "FA_APPLY"); _AddProcess(GWS2DBS_CREATE_MAIL , _HandleCmd_CreateMail
37、 , "CREATE_MAIL"); _AddProcess(GWS2DBS_DELETE_MAIL , _HandleCmd_DeleteMail , "DELETE_MAIL"); _AddProcess(GWS2DBS_QUERY_MAIL , _HandleCmd_QueryMail , "QUERY_MAIL"); _AddProcess(GWS2DBS_REFRESH_FRIEND_LIST , _HandleCmd_RefreshFriendList, "REFRESH_FRIEND"); _AddP
38、rocess(DBS_FACTION_CAL_EXP , _HandleCmd_FactionCalExp, "CAL_FACTION_EXP"); / 刪除所有主人為空的道具, 這是一項(xiàng)對(duì)玩家的道具表的維護(hù)操作, 因?yàn)閷?duì)于刪除玩家道具在本實(shí)/ 例中是處理成把它的擁有者ID置0的做法 sprintf(_szSQL, "DELETE FROM %s WHERE cha_id=0", ITEM_TB); _RunSQL(_szSQL); _pL->L("remove pets and items from db where cha_id =
39、0n"); DebugOut(0); #ifdef LINUX / 這里啟動(dòng)定時(shí)器,就好比鬧鐘一樣,到時(shí)它會(huì)通知DBS執(zhí)行備份操作 struct itimerval value, ovalue; signal(SIGALRM, pfnBackupRoutine); value.it_value.tv_sec = 5; value.it_value.tv_usec = 0; value.it_interval.tv_sec = 5; value.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &value, &ovalue
40、);#endif return true;/ 添加新的GWSbool CGWSMgr:AddGWS(CGWS *pGWS) _GWSList.push_back(pGWS); char szGWSIP255; pGWS->m_Link->GetRemoteAddr(szGWSIP , NULL , NULL); LOG(LV_M , "Add New GWS %s" , szGWSIP); return true;/ 整個(gè)DBS程序運(yùn)行的主體循環(huán)int CGWSMgr:Run() while(m_ListenSock.CanAccept() / 監(jiān)聽socket
41、檢查是否有新的gws連接上來CGWS *pNewGWS = new CGWS; pNewGWS->m_Link = new CMFTCPSession; if(pNewGWS->m_Link->Accept(&m_ListenSock) AddGWS(pNewGWS); else delete pNewGWS; LOG(LV_H , "Accept GWS Failed"); break; _DeadList.clear(); / 下面這個(gè)循環(huán)依次檢查當(dāng)前所有的gws連接,把已經(jīng)斷開或沒有響應(yīng)的連接放到另外一個(gè)鏈表里,隨后會(huì)清/ 空它, 對(duì)于保持著
42、連接的gws,檢查是否收到新的消息list<CGWS*>:iterator it; for(it = _GWSList.begin(); it!=_GWSList.end(); it+) CGWS *pGWS = (*it); pGWS->m_Link->DefProc(); / Check Connection Deadif(pGWS->m_Link->IsDead() _DeadList.push_back(pGWS); continue;/ 檢查是否收到消息while(pGWS->m_Link->GetPacket(&_RecvCm
43、d) _HandleCmd(pGWS, &_RecvCmd);/進(jìn)入消息處理 / 清除已經(jīng)斷開的連接 for(it = _DeadList.begin(); it!=_DeadList.end(); it+)CGWS *pDeadGWS = (*it); _GWSList.remove(pDeadGWS); _pL->L("clear dead GWS %d : %s", pDeadGWS->GetID(), Util_CurTime2String(0); delete pDeadGWS; SysSleep(20); / 還給cpu一定的時(shí)間 _nRun
44、Cnt+; / 定時(shí)檢查幫派的數(shù)據(jù)表,檢查幫派的有效性 int nNow = Util_GetSysTick(); if(_nFactionCheckTick=0) _nFactionCheckTick = nNow; if(_nCalFactionExpTick=0) _nCalFactionExpTick = nNow; if(nNow - _nFactionCheckTick) >= (int)(60.0f * 1000.0f * _fFactionCheckInterval) _CheckFactionValid(); _nFactionCheckTick = nNow; / 定
45、時(shí)計(jì)算幫派的總經(jīng)驗(yàn)值, 并更新數(shù)據(jù)表的相應(yīng)數(shù)據(jù) if(nNow - _nCalFactionExpTick) >= (int)(60.0f * 1000.0f * _fCalFactionExpInterval) RunCmd(DBS_FACTION_CAL_EXP); _nCalFactionExpTick = nNow; return 1;/ 下面是一個(gè)調(diào)試輸出的函數(shù), 可以察看到所有的消息對(duì)應(yīng)的處理函數(shù)累計(jì)所花費(fèi)的時(shí)間,從而可以了解那些操/ 最影響程序的性能void CGWSMgr:DebugOut(int nFlag) _pL->L("nProcess Perfo
46、rmance : %s", Util_CurTime2String(0); for(map<short , SProcess>:iterator it = _ProcessList.begin(); it!=_ProcessList.end(); it+) short sMsgType = (*it).first; SProcess *pProcess = &(*it).second); _pL->L("Process %d %-18s Time = %d msn", sMsgType , pProcess->szName, pPr
47、ocess->nTimeCnt); / 封裝和簡(jiǎn)化對(duì)GWS消息的發(fā)送, / pCmd參數(shù)包含了要發(fā)送的數(shù)據(jù)包的指針/ pGWS表示發(fā)送給哪一個(gè)GWS,此參數(shù)如果為空,則會(huì)發(fā)送給所有的GWS/ 參數(shù)bExcept表明是否除了指定的gws以外,向其它的所有g(shù)ws發(fā)送消息/ 參數(shù)bEndWrite是packet讀寫類所需要的一項(xiàng)特定操作,無需在意void CGWSMgr:_SendMsg(CMFCmdPacket *pCmd, CGWS *pGWS, bool bExcept, bool bEndWrite) if(bEndWrite) pCmd->EndWrite(); if(pGWS
48、=NULL) / All the GWS Will Receive Msg for(list<CGWS*>:iterator it = _GWSList.begin(); it!=_GWSList.end(); it+) (*it)->m_Link->SendPacket(pCmd); else if(bExcept) / Except pGWS , Other GWS will Recive Msg for(list<CGWS*>:iterator it = _GWSList.begin(); it!=_GWSList.end(); it+) if(*it
49、)!=pGWS) (*it)->m_Link->SendPacket(pCmd); else / Only pGWS will Receive Msg pGWS->m_Link->SendPacket(pCmd); / 針對(duì)所有的GWS,檢查某個(gè)玩家是否在線CGamePlayer* CGWSMgr:CheckPlayerOnline(long lID, CGWS *ppGWS) for(list<CGWS*>:iterator it = _GWSList.begin(); it!=_GWSList.end(); it+) CGWS *pGWS = (*it)
50、; CGamePlayer *pPlayer = pGWS->CheckPlayerOnline(lID); if(pPlayer) *ppGWS = pGWS; return pPlayer; return NULL;/ 消息處理函數(shù), 所有的消息處理都通過此函數(shù)進(jìn)入void CGWSMgr:_HandleCmd(CGWS *pGWS , CMFCmdPacket *pCmd) short sMsgType; pCmd->ReadShort(&sMsgType);/解析出消息類型 LOG(LV_M , "Receive Message - %d : " , sMsgType); map<short, SProcess>:iterator it = _ProcessList.find(sMsgTyp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 食品加工產(chǎn)業(yè)園區(qū)建設(shè)協(xié)議
- 食品采購原料合同
- 餐飲廚師用工合同協(xié)議書范文
- 環(huán)境監(jiān)測(cè)合作協(xié)議和保密責(zé)任聲明
- 2025年百貨日用品會(huì)員制銷售合作合同
- 2025年藥物控釋材料合作協(xié)議書
- 2024年江蘇南通市海門區(qū)衛(wèi)生健康委員會(huì)招聘合同制人員106人
- 互聯(lián)網(wǎng)教育股權(quán)增資擴(kuò)股與在線教育平臺(tái)合作協(xié)議
- 股權(quán)收購意向合同(含業(yè)績補(bǔ)償條款)
- 互聯(lián)網(wǎng)金融服務(wù)股權(quán)轉(zhuǎn)讓及風(fēng)險(xiǎn)控制協(xié)議
- 高處墜落及應(yīng)急救援培訓(xùn)考試試題及答案
- 金川公司社會(huì)招聘考試題
- 高中地理100個(gè)答題模板
- 專利技術(shù)交底書實(shí)例(一種新型地腳螺栓布置型式)
- 羊水三度污染護(hù)理查房課件
- 汽車維修工時(shí)收費(fèi)標(biāo)準(zhǔn)(二類企業(yè))
- JGT483-2015 巖棉薄抹灰外墻外保溫系統(tǒng)材料
- 華能光伏發(fā)電項(xiàng)目-施工組織設(shè)計(jì)(Ⅲ標(biāo)段)
- 【語文】貴州省貴陽市甲秀小學(xué)小學(xué)四年級(jí)下冊(cè)期末試卷(含答案)
- 留置看護(hù)工作個(gè)人總結(jié)3篇
- 荔波縣2023-2024學(xué)年三年級(jí)數(shù)學(xué)第一學(xué)期期末調(diào)研模擬試題含答案
評(píng)論
0/150
提交評(píng)論