api - 使用 lwip API 立即发送小的 lwip 数据包有困难

标签 api tcp send lwip

我正在 ST Cortex M3 设备上创建服务器。我正在使用 lwip API 和 FreeRTOS。一切正常,但响应时间很慢。我目前使用的是 lwip 1.3.2 和 FreeRTOS 7.3。

单个客户端连接到服务器并且必须频繁发送一些时间关键的数据。这些数据包大约有 6 个字节。其他时候,我发送超过 20K。

我遇到的问题是这些较小的数据包似乎要花很长时间才能发送。我认为这是因为 lwip 正​​在等待更多数据排队以进行更有效的传输。我不能等待 2 或 3 秒来发送数据;客户通常期望在几微秒或几毫秒内收到数据。

我试过使用 lwip_send 和 lwip_write。 (我知道一个与另一个相同,最后传递了一个标志。只是不得不尝试......)我已经尝试在套接字上设置 TCP_NODELAY 无济于事。我试图将 SO_SNDLOWAT 设置为“1”,但这总是返回 -1,所以我认为它不受支持。

我不想使用 TCP RAW 重做所有代码。有没有办法在 TCP RAW 模式之外调用 tcp_output() 函数?有什么方法可以加快速度,或者这就是小数据包的 lwip TCP 有多慢?

欢迎提出任何建议。谢谢。

--编辑-- 我还想补充一点,一旦我准备好传输,我会确保我在 FreeRTOS 中的 TX 任务处于最高优先级。在我调用 lwip_send/write 之前,没有其他任务在运行。

最佳答案

我对 xilinx 上的裸机 lwIP 相当有经验,而且 lwip 不会等待发送东西。它会根据以太网硬件以确认您的中断的速度抽出数据包。我一直只使用UDP。不过,我想到的是,您的问题可能出在接收端。如果您使用的是 TCP,那么这些小数据包可能会延迟发送,因为您遇到了接收问题。您需要做的是在代码中找到以太网传输的最低级别点,在其上放置一个通用输出开关。然后在收到以太网数据包时也打开通用输出开关。查看示波器上的信号。如果它证实了您的假设,则移动输出切换以缩小问题范围。清洗、冲洗并重复,直到找到问题所在。这是粗鲁且耗时的,但由于纯粹的决心,这种蛮力方法通常可以解决许多“不可能”的嵌入式软件问题。祝你好运!

关于api - 使用 lwip API 立即发送小的 lwip 数据包有困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15231800/

相关文章:

ruby-on-rails - 如何在 Rails API 中返回自定义错误代码?

django - 我如何允许用户只修改他们在 django rest 框架中的数据?

java - c - 客户端/java - 服务器 - 客户端读取奇怪的东西

node.js - 进程之间的通信 : tcp vs unix sockets, ipc vs nats

Android,如何发送 HTML 电子邮件并强制 Android 通过 G-Mail 而不是其他应用程序发送它?

ruby-on-rails - 在 Ruby on Rails 3 应用程序中开始使用 Web 服务

c++ - qFastSin 和 qFastCos(速度、安全和精度)

java - 许多线程连接使系统不稳定

c# - TcpClient 发送/关闭问题

ios - connectionDidFinishLoading 没有被调用,为什么?