使用 Lwip TCP 堆栈,如果接收到的消息大于缓冲区会怎样?

问题描述 投票:0回答:1

我一直在用 C 语言在 Raspberry Pi Pico 上做一个小的 tcp 项目,试验 lwIP api。帮助来源之一是 pico-sdk-examples。 当 lwip 堆栈收到消息时,它会调用程序员选择的方法的回调。在 pico 示例中,that 方法包含以下用于处理消息的代码,该消息以称为 pbuf 的结构传递到回调中。您可以将 pbuf 链接在一起以获得更长的消息。

   //state is a protocol control 
   //p is a pbuf

   // Receive the buffer
        const uint16_t buffer_left = BUF_SIZE - state->recv_len; 
        state->recv_len += pbuf_copy_partial(p, state->buffer_recv + state->recv_len,
                                             p->tot_len > buffer_left ? buffer_left : p->tot_len, 0);
        tcp_recved(tpcb, p->tot_len);

我的问题是关于 tcp_recved 组件。在lwip文档中它说

此函数应在应用程序处理完数据后调用。目的是在处理完数据后宣传一个更大的窗口。

如果 total_len 大于缓冲区大小,并且缓冲区已满,为什么他们的代码会宣传 tot_len 已被接收。缓冲区溢出会丢失吗?另外,我们为什么不使用 p->len?

c tcp buffer-overflow raspberry-pi-pico lwip
1个回答
0
投票

为了回答为什么我们不使用 p->len,我们使用 p->tot_len 因为我们可能想要读取整个 pbuf 链。 p->len 可能只是前 x 个字符,存储在第一个 pbuf 中; p->tot_len 是整个字符串的长度。但是,我仍然不知道如果消息太大会发生什么情况。

编辑:如果消息大于缓冲区,那么多余的部分将丢失。

© www.soinside.com 2019 - 2024. All rights reserved.