मुक्त नहीं कर रहा है मैं lwip नामक एक टीसीपी/आईपी स्टैक का उपयोग कर रहा हूं। मैंने डेटा पैकेट भेजने के लिए नीचे एक फ़ंक्शन लागू किया है, जो डेटा पैकेट प्राप्त करने वाले समान कॉलबैक फ़ंक्शन से प्रेरित है।लाइटवॉइट आईपी: बफर
हर बार एक पैकेट प्राप्त होता है, मैं pbuf_alloc
फ़ंक्शन का उपयोग करके एक बफर बना देता हूं। फिर, मैं udp_sendto
का उपयोग कर पैकेट भेजता हूं। अंत में, मैं pbuf_free
का उपयोग कर बफर को मुक्त करता हूं। (नीचे दिए गए कोड को देखें।)
किसी कारण से, pbuf_free
बफर को मुक्त नहीं कर रहा है। (मैं n
पैकेट, जहां n
पूल आकार है के बाद एक बफर अतिप्रवाह मिलता है।) The lwip wiki चेतावनी दी है कि:
नेटवर्क चालक भी कल्पना नहीं कर सकते हैं कि pbuf स्मृति वास्तव में मुक्त हो जाता है जब यह pbuf_free कहता है।
मैं अपने बफर को मुक्त करने के लिए pbuf_free
को कैसे मजबूर कर सकता हूं? बफर ओवरफ्लो से कैसे बचा जाता है?
static struct pbuf *pkt_buf = NULL;
if(pkt_buf == NULL)
pkt_buf = pbuf_alloc(PBUF_TRANSPORT, bytesToSend, PBUF_POOL);
if(pkt_buf == NULL)
{
print("(TFTP) Buffer overflow!\r\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;
}
क्या आपने बफर को संदर्भ गणना की जांच की? मुझे डर है कि अगर संदर्भ संख्या 1 है। – Fred
संभवतः 'udp_sendto' एक संदर्भ लेता है और इसे अतुल्यकालिक रूप से रिलीज़ करता है (टाइमर में)। शायद आपको इसे थोड़ी देर देने की ज़रूरत है? – ugoren
@ugoren: मैंने बफर ओवरफ़्लो होने पर प्रतीक्षा करने का प्रयास किया है, लेकिन बफर ओवरफ़्लो बनी हुई है। – Randomblue