11 2014 档案

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

点击右上角即可分享
微信分享提示