服务端和客户端心跳包机制
2023-02-18 16:41:51 时间
面试问的一个问题
客户端和服务端建立连接后,如果客户端断开连接了,服务端要怎么感知到断开呢
在我的服务器项目里,服务端和客户端之间会发送心跳包
例如在客户端的心跳包代码,每隔一秒发送一个心跳包,指令为60000
private void OnHeart()
{
if (tcp == null) return;
if (data.State < C_SOCKET_STATE.C_ConnectSecure) return;
float ftime = Time.realtimeSinceStartup - data.time_Heart;
if (ftime < ConfigXML.xml.HeartTime) return;
data.time_Heart = Time.realtimeSinceStartup;
begin(60000);
sss((int)0);
end();
}
服务端收到之后之后,更新对应连接的最后心跳时间,同时每个连接中还有checkConnect的检测超时线程,如果当前时间-最后心跳时间>心跳间隔,则感知到客户端断开连接了,服务端的代码如下
void net::EpollServer::checkConnect(S_CLIENT_BASE* c)
{
int temp = 0;
// if (c->closeState == func::S_CLOSE_SHUTDOWN)
// {
// temp = (int)time(NULL) - c->time_Close;
// if (c->is_RecvCompleted && c->is_SendCompleted)
// {
// closeSocket(c->socketfd, c, 2001);
// }
// else if (temp > 3)
// {
// closeSocket(c->socketfd, c, 2002);
// }
// return;
// }
// temp = (int)time(NULL) - c->time_Connet;
// if (c->state == func::S_Connect)
// {
// if (temp > 10)
// {
// if (this->onTimeoutEvent != nullptr) this->onTimeoutEvent(this, c, 2002);
// shutDown(c->socketfd, 0, c, 2002);
// return;
// }
// }
temp = (int)time(NULL) - c->time_Heart;
if (temp > func::__ServerInfo->HeartTime)
{
if (this->onTimeoutEvent != nullptr) this->onTimeoutEvent(this, c, 2003);
shutDown(c->socketfd, 0, c, 2003);
return;
}
}
感知断开后直接shutdown
相关文章
- 【架构师(第十五篇)】脚手架之创建项目模板开发
- 【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
- 【架构师(第十八篇)】脚手架之项目模板的安装
- 【架构师(第十九篇)】脚手架之组件库模板开发
- 【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
- 【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
- 【架构师(第二十二篇)】编辑器开发之项目整体搭建
- 【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
- 【架构师(第二十四篇)】编辑器开发之添加模版到画布
- Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序
- 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式
- 【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
- 【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
- 2021年度“CCF-腾讯犀牛鸟基金”发布结题评优结果
- 【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
- 太空噗|重燃太空热潮!与噗噗星人一同探索星海浪漫
- 算法工程师深度解构ChatGPT技术
- 【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
- 【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
- 【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router