乐鑫技术交流
直播中

刘洋

7年用户 1259经验值
私信 关注
[问答]

ESP8266 RTOS SDK中Lwip自动分包及重组的问题求解

你好,目前我在项目中需要使用8266接收网络数据包,使用Lwip 、socket、UDP协议,一次接收20KB的数据存放在Ram中。
代码如下:

   struct sockaddr_in socket_addr;
   sock_fd = socket(AF_INET,SOCK_DGRAM,0);
   socket_addr.sin_len = sizeof(socket_addr);
   socket_addr.sin_family = AF_INET;
   socket_addr.sin_port = htons(12321);
   socket_addr.sin_addr.s_addr = inet_addr("192.168.2.101");

   bind(sock_fd, (struct sockaddr *)&socket_addr, sizeof(socket_addr));
   while(1)
   {
      len_rec = recvfrom(sock_fd, (uint8 *)DataBuff,sizeof(DataBuff),0,NULL,NULL);
      printf("len_rec = %dn",len_rec);
   }


DataBuff是一个20KB的字节数组,全局变量。

在使用RTOS SDK中进行测试的过程中发现,发送端(PC)单次发送的数据包超过1500字节,8266(接收端)就收不到。
在Lwip协议栈中,一般通过修改lwipopts.h文件中的两个宏IP_REASSEMBLY、IP_FRAG为1即可实现IP层的数据包自动分包和重组,但是实际上我修改之后仍然无效,请问是不是还有其他宏需要修改?或者lwip本身有限制?
                                                                                                                                                           

回帖(1)

jsqueh

2024-7-10 17:56:19
et_fd, (struct sockaddr *)&socket_addr, sizeof(socket_addr));

首先,我需要澄清一下,ESP8266 RTOS SDK中的LwIP库默认支持UDP协议的自动分包和重组。但是,您需要确保您的代码正确地处理了这些情况。以下是一些建议和解决方案:

1. 确保您的ESP8266有足够的内存来接收20KB的数据。ESP8266的内存有限,因此请确保您的项目没有其他内存密集型任务。

2. 使用LwIP的`recvfrom()`函数来接收UDP数据包。这个函数会处理数据包的接收和重组。示例代码如下:

```c
uint8_t buffer[20 * 1024]; // 20KB的缓冲区
struct sockaddr_in from_addr;
socklen_t from_len = sizeof(from_addr);
int bytes_received = recvfrom(sock_fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&from_addr, &from_len);
```

3. 检查`recvfrom()`函数返回的字节数。如果返回的字节数小于20KB,这意味着数据包可能被分包。在这种情况下,您需要继续接收数据包,直到接收到足够的数据。

4. 如果您需要处理多个数据包,可以使用一个循环来接收数据包,直到接收到足够的数据。示例代码如下:

```c
int total_bytes_received = 0;
while (total_bytes_received < 20 * 1024) {
    int bytes_received = recvfrom(sock_fd, buffer + total_bytes_received, sizeof(buffer) - total_bytes_received, 0, (struct sockaddr *)&from_addr, &from_len);
    if (bytes_received > 0) {
        total_bytes_received += bytes_received;
    } else {
        // 处理错误或完成接收
        break;
    }
}
```

5. 确保您的网络环境稳定,以减少数据包丢失的可能性。如果数据包丢失,LwIP会自动重传数据包,但这也可能导致接收到的数据不完整。

6. 如果您仍然遇到问题,可以尝试使用其他工具(如Wireshark)来捕获网络数据包,以便更好地了解数据包的传输过程。

总之,ESP8266 RTOS SDK中的LwIP库应该能够自动处理UDP数据包的分包和重组。您需要确保您的代码正确地处理了这些情况,并检查网络环境以减少数据包丢失的可能性。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分