随笔分类 -  项目分析

摘要:著名的小退问题说这个问题著名,听过很多次但不知咋回事其是走json过来的void GameChannel::OnLogOut(){ if(m_eGameState != eGameState_EnterMap) return; ClearMapRcd();//其实很简单,就... 阅读全文
posted @ 2014-11-30 00:40 zzyoucan 阅读(155) 评论(0) 推荐(0)
摘要:玩家下线,之前一直感觉这个过程有点复杂else if (stat == link_stat::link_disconnected || stat == link_stat::link_connect_failed ){ GameChannel* pDisconnectGC = m_vecCha... 阅读全文
posted @ 2014-11-30 00:28 zzyoucan 阅读(209) 评论(0) 推荐(0)
摘要:GS踢玩家下线功能 //key:userId, val:nChannelId (当前在线用户) std::map m_mapOnLineUserByUid; /// m_vecChannel; ... 阅读全文
posted @ 2014-11-27 23:34 zzyoucan 阅读(293) 评论(0) 推荐(0)
摘要:玩家上线这个过程看了很多很多次了,这里在看下客户端打开,服务器收到libevent事件,然后new Channel这个过程都付给他各种指针,然后放到channel容器中1.客户端发送c2s_login服务器发送s2c_login并带以下结果enum LoginEnum{ LoginSucces... 阅读全文
posted @ 2014-11-23 21:44 zzyoucan 阅读(327) 评论(0) 推荐(0)
摘要:GS界面上显示的重要参考数据,这个是压测时重要参考struct GSinfo{ int revBuffNum; int sendBuffNum; int clientNum; int dbAskNum; ///NET(A),如果这个数据比较大,就说明NET即网络... 阅读全文
posted @ 2014-11-23 18:30 zzyoucan 阅读(328) 评论(0) 推荐(0)
摘要:客户端发包,GS接收bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的{ if(false == m_spDataLayer->Recv(rPkt)) return true;//没数据了 if(rPkt.is_da... 阅读全文
posted @ 2014-11-23 17:52 zzyoucan 阅读(565) 评论(0) 推荐(0)
摘要:struct LiveMgr{private: int m_nCount; /// m_vecChannels; /// m_spTimer; /// m... 阅读全文
posted @ 2014-11-23 15:47 zzyoucan 阅读(272) 评论(0) 推荐(0)
摘要:玩家游戏状态变化enum GameState//玩家游戏状态{ eGameState_OnlyConnect = 0, ///m_szUserPwd, MAX_NAME_LEN)) { m_eGameState = eGameState_Login;//玩家状态... 阅读全文
posted @ 2014-11-23 15:11 zzyoucan 阅读(351) 评论(0) 推荐(0)
摘要:GS网络连接事件//网络事件//这个事件是在libevent里面的收到的事件就是在那个listen里面,就是客户端打开,服务器收到通知link_stat stat = (link_stat)rPkt.size;if (stat == link_stat::link_connected){ Ga... 阅读全文
posted @ 2014-11-22 21:34 zzyoucan 阅读(336) 评论(0) 推荐(0)
摘要:void GameServer::ProcessThread(){ try {//在ui线程里面搞个大try不是说try效率不好吗,难道只是为了出现错误发现在GS线程里面出现的吗 ProcessThreadTry(); } catch (...) { ... 阅读全文
posted @ 2014-11-21 01:50 zzyoucan 阅读(291) 评论(0) 推荐(0)
摘要:开启GameServer模式init函数,现在看看这个大函数干什么的//这个init也是GameServerUI里面调的,这个线程其实就做了一些初始化的工作,其实这里面没有什么主不主线程,都是在一个进程里面的void __stdcall GameServer::init(){ ///设置最大连... 阅读全文
posted @ 2014-11-18 23:57 zzyoucan 阅读(569) 评论(0) 推荐(0)
摘要:关于libevent的几个问题1.他到底是如何保证这个套接字有效的主线程去断开关闭套接字,主线程去调用buffwrite,在子线程收到客户端断开时,主线程延迟1分钟释放,这样保证子线程操作完该socket的操作但其实我没有真正理解这样搞怎么就能保证安全性2.BUFFEREVENT_WRITE到底还是... 阅读全文
posted @ 2014-11-17 16:41 zzyoucan 阅读(415) 评论(0) 推荐(0)
摘要:多线程模式其实这个早看过了,在复习一下主线程创建四个子线程,一个线程一个event_base,专门派发这个有个监听线程,在监听线程收到连接之后轮询选择一个线程就交给他处理了,其实就这么简单在看看包走向客户端发过来的加入以登录为例(不知客户端是不是走这一套)1.先打包成protocol形式2.在liv... 阅读全文
posted @ 2014-11-16 19:14 zzyoucan 阅读(542) 评论(0) 推荐(0)
摘要:关于连接状态改变的情况客户端下线的两种方式1.客户端主动下线子线程会收到socket状态改变的消息/* 连接状态改变 */static void conn_eventcb(struct bufferevent *bev, short events, void *user_data){ auto... 阅读全文
posted @ 2014-11-16 17:10 zzyoucan 阅读(887) 评论(0) 推荐(0)
摘要:std::vector m_allChannels;容器,以及如何根据channelid的意义这个容器保存了所有客户端连接的channelChannel2* LibEvtServer::CreateChannel(bufferevent* be){ auto c2 = new Channel2... 阅读全文
posted @ 2014-11-16 12:37 zzyoucan 阅读(892) 评论(1) 推荐(0)
摘要:不同包客户端的处理方法对于那种事件类型的连接上了,连接失败了,断开连接了bool NGP::OnConnected(){ std::lock_guard lock(m_PktMutex);//加锁是因为runonce应该是另一个线程 m_queFunctions.push(std::bi... 阅读全文
posted @ 2014-11-15 01:34 zzyoucan 阅读(199) 评论(0) 推荐(0)
摘要:服务器发包到客户端以登录包为例SendCmd(s2c_login, &ret, sizeof(LoginEnum));end_stat BaseChannel::SendCmd(int nCmd, void* pData, int nLen){ Protocol Ptl; Ptl.cmd... 阅读全文
posted @ 2014-11-14 22:59 zzyoucan 阅读(367) 评论(0) 推荐(0)
摘要:一个包到从共享内存到GS流程上次说到一个包从共享内存池取到一个包之后放入共享队列中hr = m_spShareMemInter->pushA(sd);看看GS这边是如何取包的主线程创建了一个子线程void GameServer::ProcessThread(){ try { ... 阅读全文
posted @ 2014-11-11 22:11 zzyoucan 阅读(316) 评论(0) 推荐(0)
摘要:NGP处理部分(主要就是这个RunOnce函数,客户单肯定是开个线程取调用这个RunOnce的)void NGP::RunOnce(){ m_spTimerFac->driveTimer();//客户端心跳包驱动 //先检查一下其他命令 if(m_queFunctions.size... 阅读全文
posted @ 2014-11-11 01:28 zzyoucan 阅读(317) 评论(0) 推荐(0)
摘要:再来看看一个包走共享内存的流程先来看看net进程这块如何处理的{//用shareData这种类型封装刚才从无锁队列中取到的包 shareData sd; sd.channel_id = pkt.channel_id; sd.data = pkt.data... 阅读全文
posted @ 2014-11-09 00:19 zzyoucan 阅读(217) 评论(0) 推荐(0)