其他分享
首页 > 其他分享> > LWIP 的socket接口下接收超时的处理

LWIP 的socket接口下接收超时的处理

作者:互联网

防止后期忘记学习时遇到的问题,在此记录一下。

最近学习在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断线重连还是网线断线重连,都可以恢复通信。

标签:接收,LWIP,socket,netconn,TCP,超时,recv,函数
来源: https://blog.csdn.net/niushijia007/article/details/117221661