sendto会随机出现return -1 的现象

mekachow
Posts: 1
Joined: Tue Oct 12, 2021 10:06 am

sendto会随机出现return -1 的现象

Postby mekachow » Fri Oct 22, 2021 7:56 am

一、测试环境:
硬件官方开发板:ESP32_DevKitc_V4
IDF 的具体版本:ESP-IDF v4.0.1
开发环境: Windows
软件工程:使用BSD Socket API Example 官方工程。修改了udp_client.C的应用内容。 menuconfig 做配置更改
使用 官方的BSD Socket API Example(:\esp-idf\examples\protocols\sockets\udp_client\main\udp_client.c(如附件udp_client.c,工程配置如(sdkconfig".txt")))

二、代码出现的问题:
sendto会随机出现return -1 的现象。
错误long errno:12 。/* Not enough space */

三、提问问题:
可以从串口打印中知道,报错 errno:12 时 send82493 errno:5 /hmi : 204580 /fh : 205240
esp_get_minimum_free_heap_size() 204580
esp_get_free_heap_size() 205240
1.可以知道堆还有挺大的空间。为何会报错 errno:12。
2.sendto函数用到的堆空间是在哪里申请和哪里释放的。是否可以用freerost中的void vApplicationStackOverflowHook( TaskHandle_t xTask,签名字符 *pcTaskName );早出原因吗。


A.源代码部分:(详细请看附件)
static void udp_client_task(void *pvParameters)
{
char rx_buffer[128];
char addr_str[128];
int addr_family;
int ip_protocol;

while (1) {

#ifdef CONFIG_EXAMPLE_IPV4
struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr("192.168.1.122");
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(19999);
addr_family = AF_INET;
ip_protocol = IPPROTO_IP;
inet_ntoa_r(dest_addr.sin_addr, addr_str, sizeof(addr_str) - 1);
#else // IPV6
struct sockaddr_in6 dest_addr;
inet6_aton(HOST_IP_ADDR, &dest_addr.sin6_addr);
dest_addr.sin6_family = AF_INET6;
dest_addr.sin6_port = htons(PORT);
addr_family = AF_INET6;
ip_protocol = IPPROTO_IPV6;
inet6_ntoa_r(dest_addr.sin6_addr, addr_str, sizeof(addr_str) - 1);
#endif

int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
if (sock < 0) {
ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
break;
}
ESP_LOGI(TAG, "Socket created, sending to %s:%d", "192.168.1.102",9999);
// uint8_t flag1 = 2;

int i = 0;
int errtimer = 0;
while(1){
int err = sendto(sock, payload, 29, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
if (err < 0) {
errtimer++;
printf("errno:%d\n",errno);
printf("send%d errno:%d /",i,errtimer);
int heapmini = esp_get_minimum_free_heap_size();
printf("hmi : %d /",heapmini);
int ferrHeap = esp_get_free_heap_size();
printf("fh : %d /:",ferrHeap);
int ferrinHeap = esp_get_free_heap_size();
printf("fih : %d \n",ferrinHeap);

}
vTaskDelay(4);//4ms
i++;
if(i%200 == 0)
{
printf("send%d errno:%d /",i,errtimer);
int heapmini = esp_get_minimum_free_heap_size();
printf("hmi : %d /",heapmini);
int ferrHeap = esp_get_free_heap_size();
printf("fh : %d /:",ferrHeap);
int ferrinHeap = esp_get_free_heap_size();
printf("fih : %d \n",ferrinHeap);
}
}

vTaskDelete(NULL);

}
}


B.串口打印部分报文:(详细请看附件)
[17:33:59.440]收←◆send82000 errno:0 /hmi : 208440 /fh : 217308 /:fih : 217308

[17:34:00.240]收←◆send82200 errno:0 /hmi : 208440 /fh : 217932 /:fih : 217932

[17:34:01.040]收←◆send82400 errno:0 /hmi : 208440 /fh : 218348 /:fih : 218348

[17:34:01.396]收←◆errno:12
send82489 errno:1 /hmi : 204580 /fh : 205240 /:fih : 205240
errno:12
send82490 errno:2 /hmi : 204580 /fh : 205240 /:fih : 205240
errno:12
send82491 errno:3 /hmi : 204580 /fh : 205240 /:fih : 205240
errno:12
send82492 errno:4 /hmi : 204580 /fh : 205240 /:fih : 205240
errno:12
send82493 errno:5 /hmi : 204580 /fh : 205240 /:fih : 205240
errno:12
send82494 errno:6 /hmi : 204580 /fh : 205240 /:fih : 205240
errno:12
send82495 errno:7 /hmi : 204580 /fh : 205240 /:fih : 205240
errno:12
send82496 errno:8 /hmi : 204580 /fh : 205240 /:fih : 205240


[17:34:01.852]收←◆send82600 errno:8 /hmi : 204580 /fh : 218556 /:fih : 218556

[17:34:02.652]收←◆send82800 errno:8 /hmi : 204580 /fh : 218344 /:fih : 218344
Attachments
udp_client.c
(3.99 KiB) Downloaded 521 times
串口打印报文.txt
(68.79 KiB) Downloaded 560 times

ESP_YJM
Posts: 300
Joined: Fri Feb 26, 2021 10:30 am

Re: sendto会随机出现return -1 的现象

Postby ESP_YJM » Fri Oct 22, 2021 12:17 pm

这里的 Not enough space 是指底层 WIFI 发送 buffer 不够了,应用层 UDP 数据发送太快。建议应用层减慢 UDP 发送速率或者增大底层 WIFI 发送 buffer (idf.py menuconfig->component config->WiFi->TX buffers).

Who is online

Users browsing this forum: virgil and 73 guests