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通信并接收数据的问题,可以按照以下步骤进行操作: 1. 创建一个socket连接: 使用`socket()`函数创建一个socket连接,并指定协议(例如TCP或UDP)和传输层协议(IPv4或IPv6)。 2. 绑定socket到本地地址和端口: 使用`bind()`函数将socket绑定到本地的IP地址和端口号。 3. 监听连接请求(仅适用于TCP): 如果使用TCP协议,可以使用`listen()`函数开始监听连接请求。 4. 接受连接(仅适用于TCP): 使用`accept()`函数接受客户端的连接请求,并返回一个新的socket用于与客户端进行通信。 5. 接收数据: 使用`recv()`函数从已连接的socket接收数据。该函数将返回接收到的字节数和数据内容。 下面是一个使用lwIP库进行socket接收数据的示例代码片段: ```c #include "lwip/sockets.h" int main() { int sockfd, newsockfd; struct sockaddr_in serv_addr, cli_addr; char buffer[1024]; // 创建socket sockfd = socket(AF_INET, SOCK_STREAM, 0); // 设置服务器地址和端口 serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(1234); serv_addr.sin_addr.s_addr = INADDR_ANY; // 绑定socket bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // 监听连接请求 listen(sockfd, 5); // 接受连接 int clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen); // 接收数据 int n = recv(newsockfd, buffer, sizeof(buffer), 0); // 打印接收到的数据 printf("Received: %s\n", buffer); // 关闭socket close(newsockfd); close(sockfd); return 0; } ``` 请注意,此示例代码假设您已经正确配置了lwIP库,并且在编写和构建代码时已包含了必要的头文件和库文件。另外,您需要根据您的实际需求进行适当的错误处理和其他必要的操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值