struct LiveMgr
{
private:
int m_nCount; ///< 管理数量
std::vector<int> m_vecChannels; ///< 所有channel
std::shared_ptr<I_Timer> m_spTimer; ///< 定时器
public:
std::function<void(int channel)> m_fnTimeOutDisconnect;
void Init(int nMaxGcNumb);
bool IsLive(int nChannelId)
{
return !!(m_vecChannels[nChannelId]);
}
void OnLive(int nChannelId)
{
m_vecChannels[nChannelId] = GetTickCount();
}
void Add(int nChannelId)
{
m_nCount++;
m_vecChannels[nChannelId] = GetTickCount();
}
void Remove(int nChannelId)
{
m_nCount--;
m_vecChannels[nChannelId] = ;
}
void Check();
int GetLinks()
{
return m_nCount;
} };
这个是心跳管理类
GS初始化的时候
m_LiveMgr.m_fnTimeOutDisconnect = std::bind(&GameServer::TimeOutDisconnect, this, ph::_1);
m_LiveMgr.Init(GetMaxGcNumb()); void LiveMgr::Init(int max_gc_numb)
{
///创建内部定时检查的定时器,5s执行一次,不过为了现在方便把定时器关闭了
m_spTimer.reset(GetPlug(TimerFactory)->createTimer());
m_spTimer->regTimer(std::bind(&LiveMgr::Check, this));
m_spTimer->setInterval( * );
//为调试先关掉
//m_timer->start(); m_vecChannels.resize(max_gc_numb);//m_vecChannels保存的所有channel最新的包跟新时间,注意这个默认初始化为0
m_nCount = ;
}
那这个是什么时候更新的呢
if(rPkt.is_data)
{
if(!rPkt.data)
return false; GameChannel* pGC = m_vecChannel[rPkt.channel_id];
if(pGC)
pGC->OnReceiveData(rPkt.data, rPkt.size); m_LiveMgr.OnLive(rPkt.channel_id);//看来这个是每接收一个包的时候将channel的最新时间更新一下
}
void OnLive(int nChannelId)
{
m_vecChannels[nChannelId] = GetTickCount();
}
看看这个5s定时回调的函数做了什么
void LiveMgr::Check()
{
size_t uNow = GetTickCount();
for (size_t i = ; i < m_vecChannels.size(); ++i)//遍历所有channel,这个效率???
{
size_t uLastTick = m_vecChannels[i];
//uLastTick为0表示没有连接,这句就说明连接了并且15没有接收到数据了,就认为其断线了,会走下线处理的
//想当时测试的时候把网线拔了,此时libevent是不能收到事件的,GS他的连接还是在上面的,如果把定时器打开,15秒后会将其删除的
if(uLastTick && uNow - uLastTick > * )
{
m_fnTimeOutDisconnect(i);
Remove(i);//需要将m_vecChannels对应位置赋值为0,表示没有连接,刚才我还在想这边把socket关闭了,不会受到断开通知,这里处理了就对了
}
}
}
//看看这个function做了什么
做相应的下线处理,并关闭网络层的socket
void GameServer::TimeOutDisconnect(int nChannelId)
{
try
{
GameChannel* pGC = m_vecChannel[nChannelId];
pGC->OnDisconnect();//玩家下线处理,回头看玩家下线在详看
if(!pGC->m_pMap)
{
//PushFreeQueue(pGC);
//m_vecChannel[nChannelId] = NULL;
AutoFreeGC(pGC);
}
m_spDataLayer->Close(nChannelId);//这个属于主动断开客户端的连接,libevent那边调用close_channel放入下线队列中,主线程去关闭socket,这个过程应该很清楚了
}
catch (...)
{
DWORD e = GetLastError();
Plug::PlugMessageBox(L"m_spTCPServer->close_channel异常了啊!");
}
}
//我在想,当时踢玩家下线,是因为那边放入释放队列,60s之后关闭socket,此时客户端收到通知
但对于拔网线,那客户端好像也能收到通知,服务端心跳检测关闭时永远都不能收到通知的,那客户端怎么会收到通知的呢,来试验一下

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. 初识 css3中counter属性

    最近看到counter属性,好奇是做什么用的,于是去查了查. 1.简单介绍 counter是为css中插入计数器.[注明]在CSS2.1中counter()只能被使用在content属性上.关于浏览器 ...

  2. HTML5 学习笔记 1

    1.音频.视频 <!DOCTYPE HTML> <html> <body> <audio controls="controls"> ...

  3. 西门子SIMATIC IT平台

    西门子公司的SIMATIC IT平台基于ANSI/ISA S95标准开发,包含的功能组件覆盖了ISA S95规定的生产业务操作模型,同时也满足MESA所确定的MES系统11项功能要求. SIMATIC ...

  4. Android去除CPU占用过高时屏幕四周闪红框

    话说有些时间没有更新博客了,今天正好解决这个问题,顺便把它记录下来.. 今天遇到的情况是这样的,当CPU占用过高时,屏幕四周会出现一个红框. 闪一次两次算了,但是挺萌的(TMD)不停的闪,我的钛合金狗 ...

  5. java的基本数据类型特征

    java的数据类型分为基本数据类型和引用数据类型. 基本数据类型分为数值型.字符型(char).布尔型(boolean) 数值型变量 1.整数型 类型 占用存储空间 表示范围 byte 1字节Byte ...

  6. (1)c语言学习总结之从关键字到循环结构

    一.关键字和标示符 1.关键字:c规定的有特殊含义的单词(也就是系统起的名字),全部是小写,有32个; 由关键字引出数据类型和流程类型 1.分类: (1)数据类型:整型用int标示,字符型用char表 ...

  7. linux 下的使用 ln 创建 软链接 和 硬链接

    linux 下的一个指令 ln 作用: 创建软链接或者硬链接 Linux 系统下每创建一个文件,系统都会为此文件生成一个 index node 简称(inode) ,而每一个文件都包含用户数据(use ...

  8. 数据结构中的堆棧在C#中的实现

    一.大致学习 堆棧是一种面向表的数据结构,堆棧中的数据只能在标的某一短进行添加和删除操作,是一种典型的(LIFO)数据结构. 现实生活中的理解:自助餐厅的盘子堆,人们总是从顶部取走盘子,当洗碗工把洗好 ...

  9. android开发系列之git常用命令

    最近因为跳槽到新公司,然后新公司里面的代码管理工具是gitLab,所以我想在这篇博客里面整理一下git常用的语法. GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托 ...

  10. Android JNI如何调用第三方库

    http://www.2cto.com/kf/201504/388764.html Android JNI找不到第三方库的解决方案 cannot load library 最近做一个jni项目,拿到的 ...