美文网首页
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——心跳包以及多线程加锁

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