没有使用netbuf_delete后!

while(1)
{
    netconn_recv(udpconn,&recvbuf);
    if(recvbuf != NULL)
    {
        OS_ENTER_CRITICAL();
        memset(udp_recvbuf,0,UDP_RX_BUFSIZE);
        for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
       //判断要拷贝到UDP_RX_BUFSIZE中的数据是否大于UDP_DEMO_RX_BUFSIZE的剩余空间,如果大于
        //的话就只拷贝UDP_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
        if(q->len > (UDP_RX_BUFSIZE-data_len)) memcpy(udp_recvbuf+data_len,q->payload,(UDP_RX_BUFSIZE-data_len));//拷贝数据
        else memcpy(udp_recvbuf+data_len,q->payload,q->len);
        data_len += q->len; 
        if(data_len > UDP_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出    
       OS_EXIT_CRITICAL();
      if(strncmp((char *)udp_recvbuf,"sys:addr?",9)==0)
        {
        addr = netbuf_fromaddr(recvbuf);
        port = netbuf_fromport(recvbuf);
        sentbuf = netbuf_new();
           netbuf_alloc(sentbuf,strlen((char*)udp_sendbuf));
        sentbuf->addr = *addr;
        sentbuf->port = port;
        memcpy(sentbuf->p->payload,(void*)udp_sendbuf,strlen((char*)udp_sendbuf));
        err = netconn_send(udpconn,sentbuf);
        if(err!=ERR_OK)
           {                                        
        printf(
"发送失败\r\n");
       }
      netbuf_delete(sentbuf); //当这个没用正确使用的时候 }// if(strncmp((char *)udp_recvbuf }// if(recvbuf != NULL) }//while(1)

当netbuf_delete没有使用的时候,再一次调用netbuf_alloc函数时,会报错,

LWIP_ERROR("netbuf_alloc: invalid buf", (buf != NULL), return NULL;);

直接返回NULL。

查看LWIP_ERROR宏后,可知sentbuf=NULL才能成立。

但是,不知道为什么没有释放sentbuf,在新建netbuf_new赋值的就是NULL的了。

懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
原文地址:https://www.cnblogs.com/Rainingday/p/5919719.html