Доброго времени суток.
Есть проект под STM32F207. На нем запущен lwip.
На текущий момент используется три исходящих соединения.
Проблема в следующем: при некотором количестве раз установлений/закрытий соединения попадаю в HardFault_Handler из функции memp_malloc. В структуре memp_tab отображается некорректный адрес для выделения памяти под tcp_pcb.
Что делаю для открытия/закрытия соединения и приема/передачи данных.
Открытие соединения:
Код
test->test_pcb = tcp_new();
if(test_pcb != NULL){
err_t err;
IP4_ADDR(&ipaddr_local, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
err = tcp_bind(test->test_pcb, &ipaddr_local, 0);
if (err == ERR_OK){
// Callback функция в случае ошибки
tcp_err(test->test_pcb, test_error);
// Устанавлиается аргумент для передачи в Callback функции
tcp_arg(test->test_pcb, (void*)test);
// Собсбтвенно тут соеденяемся
err = tcp_connect(test->test_pcb, &test->ipaddr_dest, test->port, test_connected);
// Если все good, то возвращаемся из функции и ждем callback
if(err == ERR_OK)
return;
}
}
Callback функция для установления соединения
Код
err_t test_connected(void *arg, struct tcp_pcb *newpcb, err_t err){
err_t ret_err;
struct_test * test = (struct_test *)arg;
tcp_num_reconn = 0;
// Посльзовательский параметр
tcp_arg(newpcb, arg);
// Callback функция для получения данных
tcp_recv(newpcb, test_recv);
// Callback функция в случае ошибки
tcp_err(newpcb, test_error);
// Callback функция для события poll
tcp_poll(newpcb, test_poll, 4);
ret_err = ERR_OK;
return ret_err;
}
Callback функция для получения данных
Код
err_t test_recv(void *arg, struct tcp_pcb *recv_pcb, struct pbuf *p, err_t err){
err_t ret_err;
ret_err = ERR_OK;
int ptr_recv_data = 0;
unsigned char recv_data[1460];
//struct pbuf *q = p;
struct_test * test = (struct_test *)arg;
if(p != NULL){
struct pbuf *q = p;
// Подтверждаем полученные данные
tcp_recved(recv_pcb, p->tot_len);
tcp_update_rcv_ann_wnd(recv_pcb);
// Основная функция
// Осуществляет разбор входного потока
while (q != NULL){
memcpy(&recv_data[ptr_recv_data], q->payload, (int)q->len);
ptr_recv_data += (int)q->len;
q = q->next;
}
}
else{
// Закрываем соединение
test_close(test);
}
return ret_err;
}
Закрываю соединения так:
Код
tcp_close(test->test_pcb);
При этом попадаю в событие tcp_error.
В нем делаю следующее:
Код
tcp_arg(test->test_pcb, NULL);
tcp_sent(test->test_pcb, NULL);
tcp_recv(test->test_pcb, NULL);
tcp_err(test->test_pcb, NULL);
tcp_poll(test->test_pcb, NULL, 0);
if(test->test_pcb != NULL){
memp_free(MEMP_TCP_PCB, test->test_pcb);
test->test_pcb = NULL;
}
При корректном установлении соединения данные принимаются нормально.
Собственно вопрос: правильно ли я устанавливаю/закрываю соединение?
Версия lwip сначала была 1.40, теперь обновил до 1.41.