//客户端心跳检测死亡计时时间
#define CLIENT_HREAT_DEAD_TIME 60000
#define CLIENT_SEND_BUFF_TIME 200
//心跳死亡计时
time_t _dtHeart;
/*将心跳检测重置为0*/
void resetDTHeart()
{
_dtHeart = 0;
}
//心跳检测
bool checkHeart(time_t dt)
{
_dtHeart += dt;
if (_dtHeart >= CLIENT_HREAT_DEAD_TIME)
{
CellLog::Info("checkHeart dead:s=%d,time=%ld\n", _sockfd, _dtHeart);
return true;
}
return false;
}
//定时发送消息检测
bool checkSend(time_t dt)
{
_dtSend += dt;
if (_dtSend >= CLIENT_SEND_BUFF_TIME)
{
//CELLLog::Info("checkSend:s=%d,time=%d\n", _sockfd, _dtSend);
//立即将发送缓冲区的数据发送出去
SendDataReal();
//重置发送计时
resetDTSend();
return true;
}
return false;
}
/*检查时间 影响性能*/
void CheckTime()
{
//当前时间戳
auto nowTime = CELLTime::getNowInMilliSec();
auto dt = nowTime - _oldTime;
_oldTime = nowTime;
for (auto iter = _clients.begin(); iter != _clients.end(); )
{
//心跳检测
if (iter->second->checkHeart(dt))
{
if (_pNetEvent)
_pNetEvent->OnNetLeave(iter->second);
_clients_change = true;
delete iter->second;
auto iterOld = iter;
iter++;
_clients.erase(iterOld);
continue;
}
//定时发送检测 现在由于发送的数据量比较大 不需要用到定时
iter->second->checkSend(dt);
iter++;
}
}
心跳检测机制
于 2022-10-05 14:49:29 首次发布