У меня есть встроенное клиентское приложение 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);
}
}
}