LWIP TCP 客户端传输因"MEM PBUF_POOL"达到最大值而停止



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

由于我自己没有分配PBUF,而是使用更高级别的LwIP TCP函数,所以我没有PBUF指针,所以我无法释放它。

有人知道需要什么来释放PBUF吗?。

当打印LwIP统计数据时;MEM PBUF_;使用(如下所示(:

MEM PBUF_POOL
avail: 8
used: 8
max: 8
err: 126

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

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: %dn", error);
return error;
}
error = tcp_output(pcb);
if (error) {
TRACE("tcp", T_E,  "tcp_output - Code:%dn", 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 %sn", pbuf_clen(p), (char *)p->payload);
}
return ERR_OK;
}
static void tcpErrorHandler(void *arg, const  err_t err) {
TRACE("tcp", T_E,"Err:%dn", 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);
}
}

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

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;
}

最新更新