bug-004tcp网络断开重连后,客户端recv函数一直阻塞,不会返回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bug-004tcp网络断开重连后,客户端recv函数一直阻塞,不会返回相关的知识,希望对你有一定的参考价值。

【前提】客户端采用tcp阻塞模式
【现象】与相机设备建立连接后,偶尔出现几次突然就收不到相机发过来的数据;几经排查,怀疑跟网络波动有关,于是通过插拔网线来模拟网络波动,果然bug复现。

【原因】(个人理解)每一个节点(包括服务器、客户端、中间节点)都应该会用一个五元组(源IP、源端口、目的IP、目的端口和协议)来纪录一个tcp会话,哪一个节点出现网络波动,那么该节点的纪录就会被清空。所以网络恢复后,服务器端(相机)发来的数据就不会到达客户端,客户端则一直阻塞在recv函数。

【解决方案】
1、换成非阻塞模式;
2、阻塞+保活。
这样,就可以利用函数返回值来判断是否需要重连了。

以上是关于bug-004tcp网络断开重连后,客户端recv函数一直阻塞,不会返回的主要内容,如果未能解决你的问题,请参考以下文章

delphi idhttp在ADSL断网重连后会出错,是怎么回事?

RTSP连接中断重连的问题

c调用 socket 如果客户端连接断开,怎么判断? 还有怎么向多个 连接在一个服务器上的多个客户

stm32+lwip作为MCU与tcp/ip协议栈,其为一般TCP客户端,具有断开重连机制,并作为HTTP的服务端,求代码!

netty 心跳包和断线重连机制

Linux网络编程——TCP和UDP通信