Я использую стек TCP / IP под названием lwip. Я реализовал функцию ниже для отправки пакетов данных, вдохновленную аналогичной функцией обратного вызова, которая принимает пакеты данных.
Каждый раз при получении пакета я создаю буфер с помощью функции pbuf_alloc
. Затем я отправляю пакет, используя udp_sendto
. Наконец, я освобождаю буфер с помощью pbuf_free
. (См. Код ниже.)
По какой-то причине pbuf_free
не освобождает буфер. (Я получаю переполнение буфера после n
пакетов, где n
- размер пула.) lwip wiki предупреждает, что:
Сетевой драйвер также может не предполагать, что память pbuf действительно освобождена, когда он вызывает pbuf_free.
Как я могу заставить 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;
}
udp_sendto
берет ссылку и освобождает ее асинхронно (по таймеру?). Может, тебе просто нужно немного подождать? - person ugoren   schedule 18.06.2012