lwIP: Как избежать «ошибки памяти (ERR_MEM)» в приложениях, которые постоянно нуждаются в процессе подключения-отключения? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть встроенное клиентское приложение TCP, которое использует стек TCP / IP lwIP и сырой API в локальной сети.Устройство непрерывно опрашивает серверные устройства каждые 2 секунды.Сценарий выглядит следующим образом:

  • Клиент подключается к устройству сервера.
  • Отправляет запрос.
  • Получает ответ от сервера.
  • Он анализирует и обрабатывает данные.
  • Клиент закрывает соединение для подключения другого серверного устройства с другим IP-адресом.
  • Возвращается к первому шагу, и конечный автомат непрерывно запускаетсяэтот сценарий.

Через некоторое время (опрос 300), когда я вызываю функцию tcp_connect , он возвращает ERR_MEM ошибка памяти.После этого я не могу подключить серверные устройства.Как будто мое приложение переполняет всю память после непрерывного процесса отключения соединения, потому что это всегда происходит после определенного количества опросов.

Я проанализировал отправляющие / принимающие фреймы в Wireshark и процесс подключения / отключения работает как ожидалось.В стороннем программном обеспечении TCP-сервера я проверил, правильно ли работает процесс отключения.

Мне нужны некоторые рекомендации, чтобы избежать ошибки памяти в этом сценарии.

С наилучшими пожеланиями

struct tcp_pcb *pxPCBMaster;
struct sTCPMasterClient sTCPMasterClient;

/*
* This function continously runs in super loop.
* It connects and disconnects successfully but after some time
* tcp_connect function returns ERR_MEM.
*/

void vTCPSocketTestFunc (void)
{
   pxPCBMaster = tcp_new(); 

   ip_addr_t xDestIPAddress;

   IP4_ADDR (&xDestIPAddress, 192, 168, 10, 7);

   // Connect to test server
   err_t eConnStatus = tcp_connect (pxPCBMaster, 
                                   &xDestIPAddress, 
                                   80, 
                                   prveMBTCPMPortConnectionCallback);
   if (eConnStatus != ERR_OK)
   {
       printf("DEBUG_MBTCPM_PORT: TCP Connection Error Occured\n");
       printf("DEBUG_MBTCPM_PORT: Exception Code: %d\n", eConnStatus);
   }

   else
   {
      printf("DEBUG_MBTCPM_PORT: TCP Connection is successful\n");

      // Refresh Ethernet Driver and Add 2 secs Delay
      for (int i = 0; i < 200; i++)
      {
         ethernetif_input(&tcpNetif);
         HAL_Delay (10);
      }

      if (sTCPMasterClient != NULL)
      {
         mem_free(sTCPMasterClient );
      }

      // Close connection
      tcp_close(pxPCBMaster);

      // Aborts the connection by sending a RST (reset) segment to the remote 
      // host. The pcb is deallocated
      tcp_abort(pxPCBMaster);

      // Refresh Ethernet Driver and Add 2 secs Delay
      for (int i = 0; i < 200; i++)
      {
         ethernetif_input(&tcpNetif);
         HAL_Delay (10);
      }
   }
}
...