gpt4 book ai didi

c - 轻量级 IP : Buffer not freeing

转载 作者:太空狗 更新时间:2023-10-29 17:00:59 24 4
gpt4 key购买 nike

我正在使用一个名为 lwip 的 TCP/IP 堆栈.我在下面实现了一个函数来发送数据包,灵感来自一个类似的接收数据包的回调函数。

每次收到数据包时,我都会使用 pbuf_alloc 函数创建一个缓冲区。然后,我使用 udp_sendto 发送数据包。最后,我使用 pbuf_free 释放缓冲区。 (请参阅下面的代码。)

出于某种原因,pbuf_free 没有释放缓冲区。 (我在 n 个数据包后出现缓冲区溢出,其中 n 是池大小。)The lwip wiki警告:

The network driver may also not assume that the pbuf memory is actually freed when it calls 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;
}

最佳答案

您使用的是什么版本的 lwIP?根据不同的版本,答案会有很大差异。

在 pbuf_alloc() 内部调用的 memp_malloc() 分配函数失败或 pbufs 链接失败。因此,它返回 NULL。

如果传递的参数也包含 NULL,pbuf_alloc() 也将返回 NULL。(由于 NULL 参数检查)。

在较新的版本中,您能否显示 MEMP_OVERFLOW_CHECK 宏包含的值?当宏值 >= 2 时,lwIP 表现出不同的行为。

另一个原因可能是如果您使用多线程,pbuf_alloc() 中的锁定机制失败,可能导致它返回 NULL。

某些版本要求您在调用 pbuf_alloc() 之前调用 pbuf_init()。

你可以试试这个:

pkt_buf = NULL;//Use NULL, just incase the NULL is not 0 as per your compiler.
pkt_buf = pbuf_alloc(PBUF_TRANSPORT, bytesToSend, PBUF_REF);
if(pkt_buf == NULL)
{
printf("pbuf_alloc failed.\n");
}
else
{
/* Do something with the allocated pbufs and free it. */
}

PBUF_REF 不会为 pbuf 分配缓冲存储器。 pbuf 应仅在单个线程中使用,如果 pbuf 排队,则应调用 pbuf_take 来复制缓冲区。

您也可以尝试 PBUF_RAM,它将在 RAM 中分配缓冲区。

要了解更多信息,您还可以浏览您正在使用的 lwIP 版本的源文件。

关于c - 轻量级 IP : Buffer not freeing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11083931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com