1. struct LiveMgr
  2. {
  3. private:
  4. int m_nCount; ///< 管理数量
  5. std::vector<int> m_vecChannels; ///< 所有channel
  6. std::shared_ptr<I_Timer> m_spTimer; ///< 定时器
  7. public:
  8. std::function<void(int channel)> m_fnTimeOutDisconnect;
  9. void Init(int nMaxGcNumb);
  10. bool IsLive(int nChannelId)
  11. {
  12. return !!(m_vecChannels[nChannelId]);
  13. }
  14. void OnLive(int nChannelId)
  15. {
  16. m_vecChannels[nChannelId] = GetTickCount();
  17. }
  18. void Add(int nChannelId)
  19. {
  20. m_nCount++;
  21. m_vecChannels[nChannelId] = GetTickCount();
  22. }
  23. void Remove(int nChannelId)
  24. {
  25. m_nCount--;
  26. m_vecChannels[nChannelId] = ;
  27. }
  28. void Check();
  29. int GetLinks()
  30. {
  31. return m_nCount;
  32. }
  33.  
  34. };
  35. 这个是心跳管理类
  36. GS初始化的时候
  37. m_LiveMgr.m_fnTimeOutDisconnect = std::bind(&GameServer::TimeOutDisconnect, this, ph::_1);
  38. m_LiveMgr.Init(GetMaxGcNumb());
  39.  
  40. void LiveMgr::Init(int max_gc_numb)
  41. {
  42. ///创建内部定时检查的定时器,5s执行一次,不过为了现在方便把定时器关闭了
  43. m_spTimer.reset(GetPlug(TimerFactory)->createTimer());
  44. m_spTimer->regTimer(std::bind(&LiveMgr::Check, this));
  45. m_spTimer->setInterval( * );
  46. //为调试先关掉
  47. //m_timer->start();
  48.  
  49. m_vecChannels.resize(max_gc_numb);//m_vecChannels保存的所有channel最新的包跟新时间,注意这个默认初始化为0
  50. m_nCount = ;
  51. }
  52. 那这个是什么时候更新的呢
  53. if(rPkt.is_data)
  54. {
  55. if(!rPkt.data)
  56. return false;
  57.  
  58. GameChannel* pGC = m_vecChannel[rPkt.channel_id];
  59. if(pGC)
  60. pGC->OnReceiveData(rPkt.data, rPkt.size);
  61.  
  62. m_LiveMgr.OnLive(rPkt.channel_id);//看来这个是每接收一个包的时候将channel的最新时间更新一下
  63. }
  64. void OnLive(int nChannelId)
  65. {
  66. m_vecChannels[nChannelId] = GetTickCount();
  67. }
  68. 看看这个5s定时回调的函数做了什么
  69. void LiveMgr::Check()
  70. {
  71. size_t uNow = GetTickCount();
  72. for (size_t i = ; i < m_vecChannels.size(); ++i)//遍历所有channel,这个效率???
  73. {
  74. size_t uLastTick = m_vecChannels[i];
  75. //uLastTick为0表示没有连接,这句就说明连接了并且15没有接收到数据了,就认为其断线了,会走下线处理的
  76. //想当时测试的时候把网线拔了,此时libevent是不能收到事件的,GS他的连接还是在上面的,如果把定时器打开,15秒后会将其删除的
  77. if(uLastTick && uNow - uLastTick > * )
  78. {
  79. m_fnTimeOutDisconnect(i);
  80. Remove(i);//需要将m_vecChannels对应位置赋值为0,表示没有连接,刚才我还在想这边把socket关闭了,不会受到断开通知,这里处理了就对了
  81. }
  82. }
  83. }
  84. //看看这个function做了什么
  85. 做相应的下线处理,并关闭网络层的socket
  86. void GameServer::TimeOutDisconnect(int nChannelId)
  87. {
  88. try
  89. {
  90. GameChannel* pGC = m_vecChannel[nChannelId];
  91. pGC->OnDisconnect();//玩家下线处理,回头看玩家下线在详看
  92. if(!pGC->m_pMap)
  93. {
  94. //PushFreeQueue(pGC);
  95. //m_vecChannel[nChannelId] = NULL;
  96. AutoFreeGC(pGC);
  97. }
  98. m_spDataLayer->Close(nChannelId);//这个属于主动断开客户端的连接,libevent那边调用close_channel放入下线队列中,主线程去关闭socket,这个过程应该很清楚了
  99. }
  100. catch (...)
  101. {
  102. DWORD e = GetLastError();
  103. Plug::PlugMessageBox(L"m_spTCPServer->close_channel异常了啊!");
  104. }
  105. }
  106. //我在想,当时踢玩家下线,是因为那边放入释放队列,60s之后关闭socket,此时客户端收到通知
  107. 但对于拔网线,那客户端好像也能收到通知,服务端心跳检测关闭时永远都不能收到通知的,那客户端怎么会收到通知的呢,来试验一下

GS LiveMgr心跳管理类的更多相关文章

  1. 【Unity3D游戏开发】之全局管理类的几种方式 (十六)

    如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...

  2. Unity协程(Coroutine)管理类——TaskManager工具分享

    博客分类: Unity3D插件学习,工具分享 源码分析   Unity协程(Coroutine)管理类——TaskManager工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处 ...

  3. [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...

  4. FreeOnTerminate 的线程在线程管理类的Destroy释放时手工释放的问题

    这个问题折腾了我整整一天. 有一个线程管理类,集中管理所有新建的线程, 线程统一在创建时标识 FreeOnTerminate 为 True. 因为有的线程是不限次循环的,所以在管理类最后 Destro ...

  5. C++智能指针管理类

    1.程序员明确的进行内存释放 对于c++程序员,最头脑的莫过于对动态分配的内存进行管理了.c++在堆上分配的内存,需要程序员负责对分配的内存进行释放.但有时内存的释放看起来并不件很轻松的事,如下程序 ...

  6. MoveManager管理类

    MoveManager:移动管理类 struct MoveOpt { int cur_seq; ObjecInfo* obj; }; std::map<ObjID, MoveOpt> m_ ...

  7. cocos2d-x lua 实现单例(管理类)

    cocos2d-x lua 实现单例(管理类) version: cocos2d-x 3.6 示例代码 local DogManager = class("DogManager") ...

  8. Quartz管理类

    package com.sihuatech.project.task.manager; import java.text.ParseException; import org.quartz.CronT ...

  9. (转)Quartz.NET管理类

    最近做项目设计到Quartz.NET,写了一个Quartz.NET管理类,在此记录下. public class QuartzManager<T> where T : class,IJob ...

随机推荐

  1. php 安装xdebug扩展

    php 扩展获取地址 http://pecl.php.net/package/ 编译安装的过程 wget http://pecl.php.net/get/xdebug-2.2.2.tgz tar -z ...

  2. APK反编译之一

    初步接触APK反编译.刚刚使用android-apktool软件反编译了一下QQ.apk,目的只是想看看QQ这个应用软件是内部是如何设计的,希望可以在某些方面借鉴一下.下面就如何反编译做一个简单的记录 ...

  3. Oracle 11gR2 RAC修改SCAN IP

    一.查看当前环境: # grid用户 检查scan-ip地址的配置 [grid@node1 ~]$ srvctl config scan SCAN name: scan-cluster.com, Ne ...

  4. 蓝牙4.0LED灯控方案

    一.LED照明机遇 相对传统光源产品,LED灯凭借其光效高.寿命长.不含汞.总拥有成本低等优势,已被普遍认为是一种革命性和替代性的技术.随着全球白炽灯禁产.禁用政策的依次落实,白炽灯将逐渐消失于市场. ...

  5. 微软CRM解决医药企业串货之痛

    没有准确.及时的流向数据统计和分析,医药企业营销部门就无法有效管理串货泛滥问题,串货会造成渠道无利可赚,挫伤渠道的积极性,产品无人愿意卖,最终伤害的还是医药企业. 医药企业营销发展的不同阶段对串货的态 ...

  6. Http协议[Get和Post]详解

    (2012-11-27 11:23:26) 标签: android http get post mars 分类: Android系列 访问url,需要连接网络.所以,首先应该添加Manifest权限: ...

  7. core java 7 exception

    MODULE 7 Exceptions---------------------------- 程序正常执行过程中遇到的意外情况 引发异常的因素: 1)程序本身的内在因素 2)外部因素引发的,程序无须 ...

  8. NFC应用实例

    package com.example.mynfcdemon; import android.app.Activity;import android.nfc.NfcAdapter;import and ...

  9. WdatePicker 动态变量表

    4. 日期范围限制静态限制 注意:日期格式必须与 realDateFmt 和 realTimeFmt 一致 你可以给通过配置minDate(最小日期),maxDate(最大日期)为静态日期值,来限定日 ...

  10. iOS开发的22个奇谲巧技

    结合自身的实践开发经验总结出了22个iOS开发的小技巧,以非常欢乐的语调轻松解决开发过程中所遇到的各种苦逼难题,光读着便已忍俊不禁. 1. TableView不显示没内容的Cell怎么办? 类似于图1 ...