美文网首页
QT项目复习5——心跳包以及多线程加锁

QT项目复习5——心跳包以及多线程加锁

作者: StevenHD | 来源:发表于2020-12-23 00:11 被阅读0次

四、客户端

  • 现在的程序还不够健全,比如——
  • 服务器正常断开后,客户端还是正常的状态

所以需要一个断开的链接信号——

  • 服务器断开会有一个信号
  • 服务器网络异常(网络断开)的情况——

但是网断开后,已经接收不到数据了,但是服务器并没有退出客户端也没有任何改变

  • 解决方法:定时,如果某一段时间之内没收到数据,就关掉客户端
    设置一个心跳包(服务器和客户端隔一段时间就通信一次,证明还存活着),如果心跳包好几秒没收到,那么server对应的套接字就可以关闭了。

因为现在已经有了一个定时器,所以我们可以定义一个变量来表示多少次没有发送心跳包了,再定义一个(5次没有心跳包就关闭)

  • 定时器对应的是更新在线用户列表,所以我们可以将心跳包在线用户列表相关联(每发一次用户列表就加1)——

心跳包重置为0的时机——

当收到服务器心跳包的应答的时候——

四、服务器

  • 服务器的心跳包如何设置,从而在断网后可以关闭服务器
  • 难点之一——
    服务器如何定时呢?
  • alarm()只能一个时刻产生一个定时器,用一个定时器不能处理多个客户端的网络状况的。

所以最好的一个客户端对应一个定时器,这样当产生了问题的时候,就可以把套接字关掉了。

  • 所以这里使用多路IO复用的超时

一个客户端对应一个fd,对应一个反应堆,从而对应一个超时时间

超时的地方一般是阻塞在read()那里,因为没有数据读,所以可以用poll对read()进行封装。

poll作为单个套接字的反应堆——


如果超时了,就让ret为0,从而可以让服务器关闭套接字
  • 服务器加锁
    大部分客户端都在读(获取在线用户列表),只有登录(添加)和删除(退出 )的时候才是写——
    读写锁定义成全局变量
  • 删除的时候要加锁,这个时候是写锁定——
  • 插入的时候也要加锁,登录的时候也是写锁定——
  • 读取链表的时候也要加锁,不过是读锁定——
  • 考虑一下管道破裂的情况——
  • 第一次写是不会破裂的,只有第二次写的时候会破裂

这里只写一次数据write,就算正在写的时候读端关闭了,还是照常写,只不过是收到一个RST

相关文章

  • QT项目复习5——心跳包以及多线程加锁

    四、客户端 现在的程序还不够健全,比如—— 服务器正常断开后,客户端还是正常的状态 所以需要一个断开的链接信号——...

  • QT项目复习

    概念 一个PushButton按钮显示在Widget窗口上,就是父子窗口 一、内存管理 一定要在堆上建立对象,在栈...

  • QT项目复习2

    一、客户端登录 首先,信号与槽机制——login(),然后就是connected() 然后,相当于现在已经登录成功...

  • 程序打包教程

    QT5程序打包问题 问题描述:为了方便不同电脑之间QT程序的移植,简单介绍QT5打包方式打包工具:QT5自带的wi...

  • 19.同一线程加锁是没有效果的,多线程加锁才能起作用

    同一线程加锁是没有效果的,多线程加锁才能起作用

  • 多线程--mutex、原子操作、读写锁

    2. 多线程i++(不加锁、mutex、原子操作) 不加锁#include #include

  • python 单例代码块

    加锁 但是使用类方式创建的单例,无法支持多线程,因此使用加锁的方式; 未加锁部分并发执行,加锁部分串行执行,速度降...

  • QML Book 第二章 概览

    2.概览 本章将介绍如果开始使用 Qt 5 进行开发。将展示如何安装 Qt SDK,以及如何使用 Qt Creat...

  • 5.心跳检测/心跳包

    心跳是什么? 顾名思义,心跳是判断一个事物生还是死的一个标准,在swoole里,心跳是指用来判断一个连接是正常还是...

  • QT使用心得

    刚刚开始学习qt创建项目,目前碰到qt工程路径不能包含中文 以及空格,否者编译会报错

网友评论

      本文标题:QT项目复习5——心跳包以及多线程加锁

      本文链接:https://www.haomeiwen.com/subject/obcenktx.html