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的了。