LWIP裸机情况下,TCP如何进行流量控制?

2020-01-07 19:24发布

STM32上运行LWIP作为主机,计算机作为从机。
网络传输速度很快,处理速度较慢。
所以就需要通过流量控制来进行协调,不然STM32的内存很快就爆掉了。

现在使用的是裸奔,也就是在回调函数里面处理接收到的数据。
这种情况下,如何进行流量控制呢,
比如,我收到100K字节后,需要让网络传输停止1秒。然后继续。
我直觉的想法是,收完数据后,再次进入收到数据的回调函数,直接不处理就退出了。

但是带来的问题就是,后续的传输再也没法启动。
目前没有想到好方法来实现这一需求。
请有经验的大虾指导一下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
love_ourdev
1楼-- · 2020-01-08 16:02
zxq6 发表于 2019-4-20 21:04
感谢。
要的就是这种方法。
另外,请问一下,tcp_recved,在主循环里面,需要的时候调用是否可以?

看了下lwip源码,在主循环中应该可以的,因为bare-metal模式下所有操作本来就是在主循环完成的。
要注意我上面说的,一定要传递给tcp_recved函数正确的字节数;此前接收到的pbuf对象,不要忘记用pbuf_free释放。
当你调用tcp_recved函数时,lwip会在该函数更深层代码里发送tcp报文到网络上。
love_ourdev
2楼-- · 2020-01-08 21:36
回调机制给人的感觉有一点不好,就是它的状态机性质。比如这个问题在recv_callback和poll_callback中可以调用tcp_recved函数,能不能在其它地方调用不得而知。是不是在回调之前lwip准备了特殊的上下文标志呢?
以前用uip的时候就有很多事情只能在回调里做,其它地方做根本不存在uip建立的上下文环境。
一个很容易理解的例子是Windows的窗口过程就是回调机制,很多函数、操作步骤都只能在对应的窗口事件里用,其它地方用就不合编程规范。
linhuaou
3楼-- · 2020-01-08 22:31
 精彩回答 2  元偷偷看……
arm
4楼-- · 2020-01-09 01:23
lwip流控制
zxq6
5楼-- · 2020-01-09 03:55
love_ourdev 发表于 2019-4-20 21:37
回调机制给人的感觉有一点不好,就是它的状态机性质。比如这个问题在recv_callback和poll_callback中可以调 ...

谢谢,已经通过您提供的方法实现。
tangcangeng
6楼-- · 2020-01-09 06:56
love_ourdev 发表于 2019-4-20 21:37
回调机制给人的感觉有一点不好,就是它的状态机性质。比如这个问题在recv_callback和poll_callback中可以调 ...

朋友 你好  我在使用LWIP socket的时候打印提示错误:Assertion "tcp_write: arg == NULL (programmer violates API)" failed at line 382 in .... etlwipsrccore cp_out.c 请问这是什么原因造成的呢? 如何解决?

一周热门 更多>