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

2020-12-23  本文已影响0人  StevenHD

四、客户端

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

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

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

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

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

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

四、服务器

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

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

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

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


如果超时了,就让ret为0,从而可以让服务器关闭套接字

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

上一篇下一篇

猜你喜欢

热点阅读