Estoy usando una pila TCP/IP llamada lwip. Implementé una función a continuación para enviar paquetes de datos, inspirada en una función de devolución de llamada similar que recibe paquetes de datos.LightWeight IP: Buffer no libera
Cada vez que se recibe un paquete, creo un búfer usando la función pbuf_alloc
. Luego, envío el paquete usando udp_sendto
. Finalmente, libero el buffer usando pbuf_free
. (Consulte el código a continuación.)
Por alguna razón, pbuf_free
no está liberando el búfer. (Me da un desbordamiento de memoria intermedia después de n
paquetes, donde n
es el tamaño de la piscina.) The lwip wiki advierte que:
El controlador de red puede tampoco asumir que la memoria se pBuf realmente liberada cuando llama pbuf_free.
¿Cómo puedo forzar pbuf_free
para liberar mi memoria intermedia? ¿Cómo se evita el desbordamiento del búfer?
(. Mi aplicación a continuación)
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;
}
¿Revisó el recuento de referencias en el búfer? Me temo que solo se libera si el recuento de referencia es 1. – Fred
Posiblemente 'udp_sendto' toma una referencia y la libera de forma asincrónica (en un temporizador?). Tal vez solo necesitas darle un tiempo? – ugoren
@ugoren: He intentado esperar mientras hay un desbordamiento del búfer, pero el desbordamiento del búfer permanece. – Randomblue