嵌入式开发之网络心跳包---阻塞和非阻塞以及是否有必要心跳包heartbeat

1.1 TCP和UDP的心跳包是用来维持长链接的html

心跳包只是用来检测socket的连接状态编程

 

2.1 非阻塞状况下TCP 心跳包是否有必要创建心跳包网络

  须要,socket

  a.若是说 严格 检测掉线的话 那么无论是否是非阻塞 都须要心跳包。(主要是由于心跳比较方便),若是想保持长链接,就须要按期发送心跳包tcp

  b.函数

  1). A和Z通讯。实际路线多是: A->b->c->d->...->Z。post

  2). 后来,c和d有别扭,因而: A->b->c 「断X了」 d->->Z。spa

  3). 除非有超时机机制,不然recv函数不会知道c和d的分手的事。.net

3.1 TCP自带心跳包定时为2小时,是全局TCP心跳超时,会影响系统其余应用网络链接code

TCP有个KeepAlive开关,打开后能够用来检测死链接。一般默认是2小时,能够本身设置。可是注意,这是TCP的全局设置。假如为了能更及时的检测出断开的链接,把tcp_keepalive_timetcp_keepalive_intvl的时间改小(参考:Link),该机器上全部应用程序的KeepAlive检测间隔都会变小,显然是不能接受的。由于不一样应用程序的需求是不同的。

 

4.1 recv 返回值判断链接状况,

 a. 返回0

 阻塞接收的recv有时候会返回0,这仅在socket被正常关闭时才会发生。

 1) 正常关闭socket closesocket;

 2)关机

 

 b.返回-1

 1)  阻塞,通常对于阻塞的socket都会用setsockopt来设置socket的超时。
      当超时时间到达后,recv会返回错误,也就是-1,关闭重链接,无需心跳包

2) 掉线,断网直接关闭程序

假设使用Socket基于TCP通讯协议进行C/S通讯编程,客服端已经成功与服务端创建tcp链接,而且能够正常进行收发数据。

当一段时间后,服务端的程序若是调用closesocket(sClient);WSACleanup();函数关闭socket, 

那么客户端的recv()将会返回0;

若是服务端没有调用closesocket(sClient);而只调用WSACleanup();或直接关闭程序,

那么客户端的recv()将会返回-1(SOCKET_ERROR)。

以上结果在局域网通过实际验证。

 

 3)因为终端信号,服务端返回-,可是客户端依然链接,能发数据,怎么办? 心跳包重链接

其实,要断定掉线,只须要send或者recv一下,若是结果为零,则为掉线。可是,在长链接下,有可能很长一段时间都没有数据往来。理论上说,这个链接是一直保持链接的,可是实际状况中,若是中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把必定时间以内没有数据交互的链接给断掉。在这个时候,就须要咱们的心跳包了,用于维持长链接,保活。

 

 

5.1 心跳包超时时间20~40s适宜

 

 

4.1 附录

https://www.zhihu.com/question/57736822

https://blog.csdn.net/qq_23167527/article/details/54290726

https://blog.csdn.net/liaomengge/article/details/50760831

https://www.zhihu.com/question/20849677/answer/16384522

 

https://www.cnblogs.com/nightwatcher/archive/2012/08/16/2643145.html

https://blog.csdn.net/tiandyoin/article/details/30044781

https://blog.csdn.net/baodi_z/article/details/43449315

http://www.nowamagic.net/academy/detail/23350382

相关文章
相关标签/搜索