LWIP:SSI 输出长度可能会导致 TCP/IP 校验和错误
我正在使用在 ARM LPC4357(LPCOpen 2.1.12,日期 5/15/2014)上运行的 LWIP 1.4.1。我正在使用 httpserver_raw 并添加了一些 SSI 处理程序。
我发现系统对包含标签的行的大小和 SSI 处理程序输出的字节数都很敏感。标签包含在输出中。展开标签时:
\r\n
spacespace<!--#s_add-->\r\n
(标签前两个空格,论坛格式化!)当标签扩展为 1、3、5、7 等字符时,浏览器无法接收输出 & Wireshark 报告校验和错误。当标签扩展为 2、4、6、8 等字符时,浏览器会收到输出和 Wireshark 报告 OK。
如果我从标签之前删除一个空格,那么情况就会逆转。此外,如果标签大于 129 个字符(怀疑为 122),则输出始终正常(尚未发现故障)。
当 SSI 输出 >=129 字节时,将调用长度为 122(标题和标签)、122(SSI 的初始部分)和 7(SSI 的剩余部分)的 http_write() 函数。拥有 122 的第二个 tcp_write() 似乎可以解决校验和问题。(将 SSI 输出拆分为段本身就是一件奇怪的事情。以最多 122 个块的形式发送似乎是由直到标签的资源文件的大小驱动的)。
我已经使用 UART printf() 和 Wireshark 检查了 SSI 输出,一切似乎都是正确的,输出中没有损坏。http_write() 长度与输出一样正确。
我已经跟踪到 tcp_write() ,此时我开始怀疑自己;tcp_write() 肯定不能被破坏吗?有没有人在嵌入式目标或确实 tcp_write() 上使用过 LWIP SSI?