реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> lwip memp_malloc, Разрушается память по указателю TCP_PCB
_andru_
сообщение Nov 16 2012, 06:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 9-08-12
Пользователь №: 73 073



Доброго времени суток.

Есть проект под 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 23:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.02548 секунд с 7
ELECTRONIX ©2004-2016