Page 1 of 1

被send()返回error=11折磨

Posted: Fri May 06, 2022 3:18 am
by mengsg
代码如下,使用send()发送一段时间,在室内只要网络稍微一差就会出现error=11,例如网络ping值大于100ms就会出现,即使ping值恢复到10ms以内,也恢复不了。已经被这个问题折磨了好久 :( :( :(
  1. int tcpServerPublish(int sock, const uint8_t *data, size_t len)
  2.   {
  3.     if (sock == INVALID_SOCK)
  4.       return -1;
  5.     int to_write = len;
  6.  
  7.     int last_errno = 0;
  8.     int try_send_cnt = 0;
  9.     while (to_write > 0)
  10.     {
  11.       int written = send(sock, data + (len - to_write), to_write, MSG_DONTWAIT);
  12.       if (written < 0)
  13.       {
  14.         if (errno != EINPROGRESS && errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR)
  15.         {
  16.           if (errno != last_errno)
  17.           {
  18.             last_errno = errno;
  19.             ESP_LOGE(TAG, "%s(%d),[sock=%d]: Error occurred,error=%d", __func__, __LINE__, sock, errno);
  20.           }
  21.           return -1;
  22.         }
  23.         else
  24.         {
  25.           if (errno != last_errno)
  26.           {
  27.             last_errno = errno;
  28.             ESP_LOGW(TAG, "%s,[sock=%d]: Error occurred  ,error=%d", __func__, sock, errno);
  29.           }
  30.           vTaskDelay(pdMS_TO_TICKS(10));
  31.           if (try_send_cnt++ > 10)
  32.           {
  33.  
  34.             ESP_LOGE(TAG, "%s,[sock=%d]: Error occurred  ,error=%d", __func__, sock, errno);
  35.             return -2;
  36.           }
  37.         }
  38.       }
  39.       else
  40.       {
  41.         // todo
  42.         // send success
  43.         to_write -= written;
  44.         ESP_LOGD(TAG, "send %d bytes,last %d", written, to_write);
  45.         try_send_cnt = 0;
  46.       }
  47.     }
  48.  
  49.     return len;
  50.   }
  51.  

Re: esp32 做为tcp server 发送一段时间会出现error11

Posted: Mon May 09, 2022 3:00 am
by ESP_YJM
我使用了你的代码,没有发现问题。可以提供复现方法和 log。

Re: esp32 做为tcp server 发送一段时间会出现error11

Posted: Tue May 10, 2022 8:41 am
by mengsg
感谢回复和试验,我后面再贴上来,

Re: 被send()返回error=11折磨

Posted: Fri May 20, 2022 3:08 am
by YouCan
我也经常遇到这个问题,在网络不佳的情况下,经常出现

Re: 被send()返回error=11折磨

Posted: Fri May 20, 2022 9:39 am
by ESP_YJM
errno 11 可以代表 ERR_TIMEOUT,网络不好的时候,如果设置了接收超时,是会出现该问题的。