防止后期忘记学习时遇到的问题,在此记录一下。
最近学习在freertos下使用LWIP协议栈,硬件平台是STM32F407+LAN8720(正点原子的F4探索者),软件使用CUBE配置,接口函数使用socket。
函数中接收使用recv(),移植函数的编写方式如下
return_num = recv(sock_conn, (unsigned int *)client_data_buffer, 100, 0); //将收到的数据放到接收Buff
if(return_num < 0)
break;
查看recv()函数发现,他的入口参数中并没有超时的设定,而且函数本身有阻塞机制,如果没有接收到数据,函数就一直阻塞。在正常使用时的收发数据并没有什么问题,但是当使用过程中出现了TCP连接中断或者物理层的连接失效会时,函数仍然一直阻塞。当TCP或者物理层重新连接后,函数的阻塞并不会取消,这就不能重新建立连接从而导致TCP通讯失效。
在《嵌入式网络那些事LwIP协议深度剖析与实战演练》中针对此问题有相关的解决方案,如下
1、修改LWIP_SO_RCVTIMEO宏定义为1,定义接收超时相关函数
2、修改函数netconn_alloc(enum netconn_type t, netconn_callback callback)中的关于超时时间的设定,如下conn->recv_timeout = 3000;//3s
更改完成后,无论TCP断线重连还是网线断线重连,都可以恢复通信。