标签:接收 LWIP socket netconn TCP 超时 recv 函数
防止后期忘记学习时遇到的问题,在此记录一下。
最近学习在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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。