我正在使用名为lwip的TCP/IP堆栈。我已经在下面实现了一个函数来发送数据包,这得益于类似的接收数据包的回调函数。LightWeight IP:缓冲区未释放
每次收到数据包时,我都会使用pbuf_alloc
函数创建一个缓冲区。然后,我使用udp_sendto
发送数据包。最后,我使用pbuf_free
释放缓冲区。 (请参阅下面的代码。)
由于某些原因,pbuf_free
未释放缓冲区。 (我拿到后n
个包,其中n
是池大小缓冲区溢出。)The lwip wiki警告说:
网络驱动程序也可以不承担时,它调用pbuf_free该PBUF内存 实际上释放。
如何强制pbuf_free
释放我的缓冲区?如何避免缓冲区溢出?
(我下面执行)
static err_t IAP_tftp_send_data_packet(struct udp_pcb *upcb, struct ip_addr *to, int to_port, int block)
{
err_t err;
struct pbuf *pkt_buf;
char packet[TFTP_DATA_PKT_LEN_MAX];
int bytesRead;
int bytesToSend;
/* Specify that we are sending data. */
IAP_tftp_set_opcode(packet, TFTP_DATA);
/* Specify the block number that we are sending. */
IAP_tftp_set_block(packet, block);
bytesRead = IAP_tftp_set_data(packet, block);
if(bytesRead != 0) {
bytesToSend = TFTP_DATA_PKT_LEN_MAX - (512 - bytesRead + 1);
} else {
bytesToSend = TFTP_DATA_PKT_LEN_MAX - 512;
}
pkt_buf = pbuf_alloc(PBUF_TRANSPORT, bytesToSend, PBUF_POOL);
if (!pkt_buf)
{
print("(TFTP) Buffer overflow!\r\n");
}
/* Copy the file data onto pkt_buf. */
memcpy(pkt_buf->payload, packet, bytesToSend);
err = udp_sendto(upcb, pkt_buf, to, to_port);
/* free the buffer pbuf */
printf("%d\n\r", pbuf_free(pkt_buf));
return err;
}
您是否检查缓冲区的引用计数?恐怕只有引用计数为1时才会释放它。 – Fred
可能'udp_sendto'接受一个引用并以异步方式释放它(在一个定时器中?)。也许你只需要给它一段时间? – ugoren
@ugoren:我尝试了等待,虽然有缓冲区溢出,但缓冲区溢出仍然存在。 – Randomblue