首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于“内存PBUF_POOL”达到最大值,LWIP TCP客户端传输停止

由于“内存PBUF_POOL”达到最大值,LWIP TCP客户端传输停止
EN

Stack Overflow用户
提问于 2020-08-25 16:57:15
回答 1查看 244关注 0票数 0

我正在使用LwIPstack (和FreeRtos)为STM32F7系统制作一个TCP客户端程序,它可以很好地连接到服务器,但我只能传输8条消息。这似乎是因为“内存PBUF_POOL”达到了最大值。似乎在发送消息并关闭连接后,PBUF永远不会被释放。

因为我不是自己分配PBUF,而是使用更高级的LwIP TCP函数,所以我没有PBUF的指针,所以我不能释放它。

有谁知道释放PBUF需要做些什么?

当打印LwIP统计数据时,我可以看到所有的“内存PBUF_POOL”都被使用了(如下所示):

代码语言:javascript
复制
MEM PBUF_POOL
avail: 8
used: 8
max: 8
err: 126

作为参考,我的代码如下所示:

代码语言:javascript
复制
static uint32_t tcp_send_packet(struct tcp_pcb *pcb)
{
    static auto cnt = 0;
    string string = "Hej Med Dig:" + std::to_string(cnt++);
    const uint32_t len = string.length();

    err_t error = tcp_write(pcb, &string.c_str()[0], len, TCP_WRITE_FLAG_COPY);
    if (error) {
        TRACE("tcp", T_E,  "tcp_write - Code: %d\n", error);
        return error;
    }

    error = tcp_output(pcb);
    if (error) {
        TRACE("tcp", T_E,  "tcp_output - Code:%d\n", error);
    }
    return error;
}

err_t connectCallback(void *arg, struct tcp_pcb *tpcb, err_t err)
{
    TRACE("tcp", T_E, "Connection Established.\n");
    return ERR_OK;
}

err_t tcpRecvCallback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
    TRACE("tcp", T_E,"Data recieved.\n");
    if (p == NULL) {
        TRACE("tcp", T_E, "The remote host closed the connection.\n");
        //tcp_close_con();
        return ERR_ABRT;
    } else {
        TRACE("tcp", T_E,"pbufs %d - pbuf %s\n", pbuf_clen(p), (char *)p->payload);
    }
    return ERR_OK;
}

static void tcpErrorHandler(void *arg, const  err_t err) {
    TRACE("tcp", T_E,"Err:%d\n", err);
}

static void client_close(struct tcp_pcb *pcb)
{
   tcp_arg(pcb, NULL);
   tcp_sent(pcb, NULL);
   tcp_close(pcb);
}

err_t tcpSendCallback(void *arg, struct tcp_pcb *tpcb, u16_t len) {
    TRACE("tcp", T_E,"Data sent.\n");
    return ERR_OK;
}

void msgClientTask(void *arg) {
    vTaskDelay(1000);
    struct ip4_addr ip;
    while (1) {
        IP4_ADDR(&ip, 192,168, 10 ,100);    //IP of my server
        tcp_pcb *pcb = tcp_new();
        tcp_err(pcb, tcpErrorHandler);
        tcp_recv(pcb, tcpRecvCallback);
        tcp_sent(pcb, tcpSendCallback);
        tcp_connect(pcb, &ip, 4002, connectCallback);
        tcp_send_packet(pcb);
        vTaskDelay(100);
        client_close(pcb);
        vTaskDelay(100);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-11 01:15:40

我认为您需要调用tcp_recved,并在使用数据后在tcpRecvCallback中使用pbuf_free释放传递的pbuf

代码语言:javascript
复制
err_t tcpRecvCallback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
    if (p == NULL) {
        tcp_close_con();
        return ERR_ABRT;
    } else {
        // use data in pbuf p here            

        // Acknowledge received data and free pbuf
        tcp_recved(tpcb, p->len);
        pbuf_free(p);
    }
    return ERR_OK;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63575390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档