搜索
bottom↓
回复: 14

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

[复制链接]

出0入22汤圆

发表于 2019-4-20 11:57:00 | 显示全部楼层 |阅读模式
STM32上运行LWIP作为主机,计算机作为从机。
网络传输速度很快,处理速度较慢。
所以就需要通过流量控制来进行协调,不然STM32的内存很快就爆掉了。

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

但是带来的问题就是,后续的传输再也没法启动。
目前没有想到好方法来实现这一需求。
请有经验的大虾指导一下,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2019-4-20 12:02:30 | 显示全部楼层
和计算机通讯协议加条暂停指令,收到100K字节发一下暂停指令给计算机上位机软件,让它歇歇再发

出0入0汤圆

发表于 2019-4-20 13:03:30 | 显示全部楼层
TCP自动滑窗,所以天生带流控特性。

出0入0汤圆

发表于 2019-4-20 14:26:24 | 显示全部楼层
TCP滑动窗口,拥塞机制,都替你做好了

出870入263汤圆

发表于 2019-4-20 17:16:52 | 显示全部楼层
我理解楼主说的意思。lwip的bare-metal模式是基于回调的,在收到数据时,通过tcp_recv注册的回调函数recv_callback会被lwip调用。在recv_callback回调函数中调用tcp_recved以确认数据已经被用户处理掉了。如果你想停下,不调用tcp_recved函数,lwip应该会在后续每隔一定时间再回调recv_callback的吧。我猜的,需要确认。

出870入263汤圆

发表于 2019-4-20 17:23:57 | 显示全部楼层
本帖最后由 armstrong 于 2019-4-20 17:24 编辑

我刚才看了看自己以前的代码,找到了肯定有效的方法。就是在recv_callback函数内不调用tcp_recved函数(不过数据要先读取,并记录字节数之后会用到),lwip会认为你没有拿走数据,所以就不会腾出接收窗口。当你想继续接收时,你在poll_callback(通过tcp_poll注册的回调函数)里再调用tcp_recved即可,这时lwip会腾出接收窗口,于是后续数据会继续流入。

出0入22汤圆

 楼主| 发表于 2019-4-20 21:04:40 | 显示全部楼层
armstrong 发表于 2019-4-20 17:23
我刚才看了看自己以前的代码,找到了肯定有效的方法。就是在recv_callback函数内不调用tcp_recved函数(不 ...

感谢。
要的就是这种方法。
另外,请问一下,tcp_recved,在主循环里面,需要的时候调用是否可以?
还是必须要在那个回调函数里面来进行调用?

出870入263汤圆

发表于 2019-4-20 21:23:57 | 显示全部楼层
zxq6 发表于 2019-4-20 21:04
感谢。
要的就是这种方法。
另外,请问一下,tcp_recved,在主循环里面,需要的时候调用是否可以?

看了下lwip源码,在主循环中应该可以的,因为bare-metal模式下所有操作本来就是在主循环完成的。
要注意我上面说的,一定要传递给tcp_recved函数正确的字节数;此前接收到的pbuf对象,不要忘记用pbuf_free释放。
当你调用tcp_recved函数时,lwip会在该函数更深层代码里发送tcp报文到网络上。

出870入263汤圆

发表于 2019-4-20 21:37:31 | 显示全部楼层
回调机制给人的感觉有一点不好,就是它的状态机性质。比如这个问题在recv_callback和poll_callback中可以调用tcp_recved函数,能不能在其它地方调用不得而知。是不是在回调之前lwip准备了特殊的上下文标志呢?
以前用uip的时候就有很多事情只能在回调里做,其它地方做根本不存在uip建立的上下文环境。
一个很容易理解的例子是Windows的窗口过程就是回调机制,很多函数、操作步骤都只能在对应的窗口事件里用,其它地方用就不合编程规范。

出100入0汤圆

发表于 2019-4-21 09:51:43 | 显示全部楼层
mark学习下

出0入0汤圆

发表于 2019-4-21 14:07:54 来自手机 | 显示全部楼层
lwip流控制

出0入22汤圆

 楼主| 发表于 2019-5-13 12:10:32 | 显示全部楼层
armstrong 发表于 2019-4-20 21:37
回调机制给人的感觉有一点不好,就是它的状态机性质。比如这个问题在recv_callback和poll_callback中可以调 ...

谢谢,已经通过您提供的方法实现。

出0入0汤圆

发表于 2019-6-12 07:59:24 | 显示全部楼层
armstrong 发表于 2019-4-20 21:37
回调机制给人的感觉有一点不好,就是它的状态机性质。比如这个问题在recv_callback和poll_callback中可以调 ...

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

出870入263汤圆

发表于 2019-6-12 09:59:19 | 显示全部楼层
tangcangeng 发表于 2019-6-12 07:59
朋友 你好  我在使用LWIP socket的时候打印提示错误:Assertion "tcp_write: arg == NULL (programmer vi ...

调试信息本身已经很清楚了,说你调用tcp_write(pcb, arg, len,apiflags)函数时,传入的arg参数为NULL了。仔细检查你的上层代码,不应该传入空指针。

出0入0汤圆

发表于 2019-6-12 12:03:54 | 显示全部楼层
armstrong 发表于 2019-6-12 09:59
调试信息本身已经很清楚了,说你调用tcp_write(pcb, arg, len,apiflags)函数时,传入的arg参数为NULL了。 ...

感谢回复 我看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 18:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表