This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C1294NCPDT:NDK HTTP 服务器在 TCP Accept()之前停止响应

Guru**** 2468460 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/656848/rtos-tm4c1294ncpdt-ndk-http-server-stops-responding-until-tcp-accept

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

我遇到了一个问题、即 NDK 的 HTTP 服务器偶尔(大约运行5小时后)会停止响应、直到 TCP 守护程序接受新连接、该连接以某种方式更改网络堆栈状态、使 HTTP 服务器再次开始响应。 有人可以建议我如何开始调试此问题吗? 我已经连接了调试器、但没有注意到任务抢占或内存问题上的任何奇怪之处。  

类似地、是否有人建议我可以在哪里连接到 NDK 来启动看门狗计时器? 如果 NDK 确实进入挂起状态、我想重置我的系统。

谢谢、

Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nick、

    DHCP 提供的 IP 地址的租用时间是多少? 我不知道与此相关的问题、但可能需要注意。 让 Wireshark 运行并查看是否同时发生了任何问题可能会很有趣。

    我需要进一步考虑看门狗问题、但您可以始终执行一个只执行 Ping 操作的任务(例如、默认网关)。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    IP 是静态的、并由 DHCP 服务器保留、因此不应存在任何冲突。 生产环境中根本不会有 DHCP 服务器。 今天我将运行 Wireshark 并报告结果。

    感谢有关 ping 默认网关的任务的建议。 我是否可以确定当 HTTP 服务器挂起时此任务将挂起? 我提出的原因是 TCP 侦听器任务继续正常响应、否则我只需切换到非阻塞套接字并从该任务启动看门狗。 我将尝试一下、看看。

    谢谢、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、我立即注意到使用 Wireshark 的一件事是、我们的其中一个 Javascript 中有一个错误、导致它以相当高的速率(10个请求/秒左右)向 CGI 函数发出 HTTP 请求。 我不认为这应该挂起 NDK、但我在这里提到它、以防它相关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于 ping 任务、NDK 是否可以发送不涉及设置控制台的 ICMP Ping?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nick、

    讨论 NDK 中的 ti/ndk/tools/console/conping.c 以获取示例。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、我看过这个功能、但希望有更方便的东西。

    是否无法通过回调挂钩堆栈事件循环? TCP 服务器在 HTTP 停止响应时仍然工作这一事实让我担心 ping 方法实际上会实现我的目标。

    到目前为止、我还无法在 Wireshark 打开的情况下重新创建问题、但今天我将再次尝试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nick、

    您是否能够获得 Wireshark 捕获?

    我尤其想了解 Wireshark 在您尝试连接到 HTTP 服务器时显示的内容、但它没有响应。

    在此期间打印 TCP 套接字表也很有用。 我对如何执行此操作有一个想法。

    由于您有一个 TCP 守护程序没有此响应问题,因此您可以对其进行修改,以调用一个新函数来输出套接字表。

    其理念是:

    1. 运行应用程序、等待~5小时
    2. 运行 Wireshark (5小时后,在尝试 HTTP 服务器之前)
    3. 尝试连接到 HTTP 服务器。
      1. Wireshark 中有什么有趣的显示吗?
    4. 如果没有响应,则尝试连接到守护程序服务器(应响应)。
    5. 更新守护程序线程后,它现在应该打印出套接字。
    6. HTTP 套接字是否正在侦听?

    您可以使用附加文件中的代码打印套接字表。 您应该能够将此文件添加到您的项目中并将其编译。

    然后,您可以按以下方式调用它以打印 TCP 套接字:

    SockUtils_printSockTable (IPPROTO_TCP);

    //(可选)随后调用 System_flush()以将输出传送到控制台。

    Steve

    e2e.ti.com/.../SockUtils.h

    e2e.ti.com/.../SockUtils.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nick、

    这是否得到了解决?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的帮助。 幸运的是、自从修复了 javascript 中的错误后、我就无法重现此问题、该错误基本上使 HTTP 服务充斥着请求。 我不确定为什么从 TCP 守护程序接受套接字连接会使 HTTP 服务再次开始响应、但很难想象出现这种情况的非恶意原因(前提是我们的应用程序没有错误)。 我将添加一些集成测试以加载测试 HTTP 服务器、然后查看是否可以重新创建问题、如果可以、我将获取您请求的数据。

    应在一天或两天内完成。

    谢谢、
    Nick
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我无法重现此问题。 似乎丢弃与.cfg 文件中定义的连接限制一致的连接。