【问题标题】:How to delay the outcoming data stream in Snap如何延迟 Snap 中的输出数据流
【发布时间】:2015-08-08 09:48:55
【问题描述】:

我可以通过 Arduino Mega 上的 WiFi 屏蔽 (ESP8266) 发送 GET 请求,并且我有一个 Snap-Webserver 正在运行,它为带有大 .txt 文件 (~ 1 MB) 的静态目录提供服务。

不幸的是,我无法用 Arduino 解析传入数据的速度与发送的速度一样快。我丢失了大约 50% 的传入数据。

是否有可能配置 Snap 以延迟输出数据流?如果我可以告诉 Snap 在 .txt 文件中的分隔符之后等待约 10 毫秒(例如,'\n'),那将是完美的。

【问题讨论】:

  • 这听起来很奇怪。在标准设置中,HTTP 的底层传输层是 TCP,它确保了可靠的传输。引用the Wikipedia article“TCP 使用端到端的流量控制协议来避免发送方发送数据过快,TCP 接收方无法可靠地接收和处理数据。”
  • 我也是这么认为的,但我看到的唯一一件事就是数据丢失,我只是知道为什么会出现这种情况。会不会是 WiFi shield 的驱动没有按照你描述的方式实现 TCP?
  • 您可以重写 Arduino 代码以使用 Range: 标头进行多次 GET 调用。
  • @Cirquit 在尝试实施一些限制解决方案之前,我建议尝试更深入地了解问题的根源。特别是,使用Wiresharktcpdump 之类的工具并观察正在发生的事情、网络流量的情况、是否已交付所有数据等。否则,您的解决方法可能会掩盖另一个问题,该问题会再次困扰您稍后。
  • 我在我的代码中发现了错误。不幸的是,它引发了另一个问题,一个可能的解决方案是限制 tcp 的片段大小。问题在于只有 2KB Ram 的 Arduino Mega - 但我得到的片段几乎总是在 4KB 之间。即使我有时可以保存传入的数据,如果我想搜索或拆分它,Arduino 也会停止一切。

标签: haskell streaming haskell-snap-framework


【解决方案1】:

我会插入一个代理服务器来限制数据。

这是一个用 100 行 Python 编写的简单代理,可以轻松修改以添加输出延迟:

http://voorloopnul.com/blog/a-python-proxy-in-less-than-100-lines-of-code/

【讨论】:

  • 我不知道任何python,但我会尽力让它运行起来。一有结果就去报告/接受!
  • 不幸的是,我没有看到任何变化,即使我操纵了延迟/数据包大小。我修改了on_recv,因此它会通过我的分隔符* 将传入的数据分成块,然后在每次发送后迭代我使用time.sleep(1) 的列表时。它应该在每个块之后等待 1 秒,但它没有:( lpaste.net/138291
  • 好的,我知道了!我添加了一个自定义分隔符,因此“GET”请求不会与我的数据分开。 lpaste.net/138292
猜你喜欢
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多