11 2014 档案
摘要:著名的小退问题说这个问题著名,听过很多次但不知咋回事其是走json过来的void GameChannel::OnLogOut(){ if(m_eGameState != eGameState_EnterMap) return; ClearMapRcd();//其实很简单,就...
阅读全文
摘要:玩家下线,之前一直感觉这个过程有点复杂else if (stat == link_stat::link_disconnected || stat == link_stat::link_connect_failed ){ GameChannel* pDisconnectGC = m_vecCha...
阅读全文
摘要:GS踢玩家下线功能 //key:userId, val:nChannelId (当前在线用户) std::map m_mapOnLineUserByUid; /// m_vecChannel; ...
阅读全文
摘要:玩家上线这个过程看了很多很多次了,这里在看下客户端打开,服务器收到libevent事件,然后new Channel这个过程都付给他各种指针,然后放到channel容器中1.客户端发送c2s_login服务器发送s2c_login并带以下结果enum LoginEnum{ LoginSucces...
阅读全文
摘要:GS界面上显示的重要参考数据,这个是压测时重要参考struct GSinfo{ int revBuffNum; int sendBuffNum; int clientNum; int dbAskNum; ///NET(A),如果这个数据比较大,就说明NET即网络...
阅读全文
摘要:客户端发包,GS接收bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的{ if(false == m_spDataLayer->Recv(rPkt)) return true;//没数据了 if(rPkt.is_da...
阅读全文
摘要:struct LiveMgr{private: int m_nCount; /// m_vecChannels; /// m_spTimer; /// m...
阅读全文
摘要:玩家游戏状态变化enum GameState//玩家游戏状态{ eGameState_OnlyConnect = 0, ///m_szUserPwd, MAX_NAME_LEN)) { m_eGameState = eGameState_Login;//玩家状态...
阅读全文
摘要:GS网络连接事件//网络事件//这个事件是在libevent里面的收到的事件就是在那个listen里面,就是客户端打开,服务器收到通知link_stat stat = (link_stat)rPkt.size;if (stat == link_stat::link_connected){ Ga...
阅读全文
摘要:void GameServer::ProcessThread(){ try {//在ui线程里面搞个大try不是说try效率不好吗,难道只是为了出现错误发现在GS线程里面出现的吗 ProcessThreadTry(); } catch (...) { ...
阅读全文
摘要:开启GameServer模式init函数,现在看看这个大函数干什么的//这个init也是GameServerUI里面调的,这个线程其实就做了一些初始化的工作,其实这里面没有什么主不主线程,都是在一个进程里面的void __stdcall GameServer::init(){ ///设置最大连...
阅读全文
摘要:关于libevent的几个问题1.他到底是如何保证这个套接字有效的主线程去断开关闭套接字,主线程去调用buffwrite,在子线程收到客户端断开时,主线程延迟1分钟释放,这样保证子线程操作完该socket的操作但其实我没有真正理解这样搞怎么就能保证安全性2.BUFFEREVENT_WRITE到底还是...
阅读全文
摘要:多线程模式其实这个早看过了,在复习一下主线程创建四个子线程,一个线程一个event_base,专门派发这个有个监听线程,在监听线程收到连接之后轮询选择一个线程就交给他处理了,其实就这么简单在看看包走向客户端发过来的加入以登录为例(不知客户端是不是走这一套)1.先打包成protocol形式2.在liv...
阅读全文
摘要:关于连接状态改变的情况客户端下线的两种方式1.客户端主动下线子线程会收到socket状态改变的消息/* 连接状态改变 */static void conn_eventcb(struct bufferevent *bev, short events, void *user_data){ auto...
阅读全文
摘要:std::vector m_allChannels;容器,以及如何根据channelid的意义这个容器保存了所有客户端连接的channelChannel2* LibEvtServer::CreateChannel(bufferevent* be){ auto c2 = new Channel2...
阅读全文
摘要:不同包客户端的处理方法对于那种事件类型的连接上了,连接失败了,断开连接了bool NGP::OnConnected(){ std::lock_guard lock(m_PktMutex);//加锁是因为runonce应该是另一个线程 m_queFunctions.push(std::bi...
阅读全文
摘要:服务器发包到客户端以登录包为例SendCmd(s2c_login, &ret, sizeof(LoginEnum));end_stat BaseChannel::SendCmd(int nCmd, void* pData, int nLen){ Protocol Ptl; Ptl.cmd...
阅读全文
摘要:一个包到从共享内存到GS流程上次说到一个包从共享内存池取到一个包之后放入共享队列中hr = m_spShareMemInter->pushA(sd);看看GS这边是如何取包的主线程创建了一个子线程void GameServer::ProcessThread(){ try { ...
阅读全文
摘要:NGP处理部分(主要就是这个RunOnce函数,客户单肯定是开个线程取调用这个RunOnce的)void NGP::RunOnce(){ m_spTimerFac->driveTimer();//客户端心跳包驱动 //先检查一下其他命令 if(m_queFunctions.size...
阅读全文
摘要:再来看看一个包走共享内存的流程先来看看net进程这块如何处理的{//用shareData这种类型封装刚才从无锁队列中取到的包 shareData sd; sd.channel_id = pkt.channel_id; sd.data = pkt.data...
阅读全文
摘要:现在就来看看共享内存的初始化(过程是非常复杂的,也看了好多次)1.内存池(其实这个也是放到共享内存里面)ProcessMemPoolEx m_ProcessMemPool;{ 其中包括小,中,大三种模式,就以小举个例子 1.是否初始化m_镜像,表示2是否初始化, 2.托管内存队列:...
阅读全文
摘要:上次说到对于那种有内容的包bool TCPServer::on_receive_data(int channel_id, void* data, int len){ packet pkt; { pkt.data = m_memPool.popPkt(len);//从内存池分...
阅读全文
摘要://一个发包的流程第一个包就是客户端的心跳包,现在加了版本的包再来看看这个发包打包过程,过程坚持,但理解费劲void NGP::OnliveTimer()//客户端心跳,5s发一次{ SendCmd(c2s_on_live, NULL, 0);}bool NGP::SendCmd(int nC...
阅读全文
摘要:什么是union?翻译过来说,就是共用体,或者也叫联合体。说到了union,也就是共用体,就不得不说一下struct了,当我们有如下的struct的定义时:123456struct student{ char mark; long num; float score;};关于struct的内存结构,将...
阅读全文
摘要:一个客户端连接网络模块工作(一个连接的过程)监听线程收到一个连接后像轮询线程的连接队列中push一个conn_queue_item,然后向soketpair中写入一个字节此时子线程就是自动调用设置的事件,然后从连接队列中pop一个socket然后创建一个机遇socket的bufferevent在cr...
阅读全文
摘要:GS进程首先创建共享内存,然后创建子进程首先也是初始化共享内存,就是从刚才的GS的创建的共享内存读出地址,然后就是libevent创建libevnet线程和监听线程此时net进程会创建一个线程 std::thread thrPush([this]() { for (;;) ...
阅读全文
摘要:BUFF,DEBUFF:增益状态,包括自己或者队友施加的,例如骑士的祝福,牧师的耐力精神,小德的爪子DEBUFF就是减益状态,例如你PK的时候法师的寒冰箭减速,盗贼的毒药,SS的腐蚀等等NPC:NPC就是Non-Player-Controlled Character 即“非人控制玩家角色”,我们游戏...
阅读全文
摘要:网络模块(1)一.服务端:暂时就以libevent模块,共享内存等下1.GS打开,首先创建4个libevent子线程,当然为每个线程设置连接通知回调函数,这个是基于sockpair的,然后再创建一个监听线程,专门负责监听2.监听线程收到一个连接后,通过轮询选择一个线程,然后向这个线程的conn_qu...
阅读全文