私は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