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/TM4C1292NCPDT:TCP 套接字应用在 NDK 上关闭

Guru**** 2392905 points
Other Parts Discussed in Thread: TM4C1292NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/691595/rtos-tm4c1292ncpdt-tcp-socket-application-close-on-ndk

器件型号:TM4C1292NCPDT

工具/软件:TI-RTOS

您好!

我将 TI NDK - NDK_2_25_00_09和 TI RTOS - tirtos_tivac_2_16_01_14用于 DUT、即 TM4C1292NCPDT。  

我已经开发了一个在 NDK 堆栈上运行的 Modbus 从 TCP 协议应用。 我为 Modbus TCP 数据包创建了 TCP 套接字线程、即端口号502及其打开的 TCP 通道和关闭 TCP 通道、此时 Modbus Client 应用程序要分别连接和断开连接。

找到 Wireshark 快照。

3、4和5号- 用于建立连接。

编号6、7、8和9 -用于断开连接。

这里是192.168.8.2 -桌面版,即运行系统的 Modbus TCP 客户端应用程序。

192.168.8.4 -是我的 DUT (TM4C 器件)、即运行器件的 Modbus 从 TCP 应用。

当 Cient 应用程序关闭并断开连接时、这种方法非常适用。 但是、当连接客户端应用程序时关闭 PC 电源时、我将无法通信 Modbus TCP 事务、而我将能够建立 TCP 连接、并且能够正确 ping 通。

在这里、我发现当客户端应用程序突然关闭时、Modbus TCP 套接字没有正确关闭。

我们如何处理我的应用中的这种情况? 即使客户端应用程序突然关闭、我的 TCP 套接字也需要在经过一段时间或验证后关闭。

此致

巴拉

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

    一种方法是使用 socket 选项 so_keepalive 来了解套接字上的连接是否仍处于活动状态。 您可以在《NDK API 参考指南》中的 getsockopt 下找到有关它的更多信息。

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

    您好 Gerardo、

    感谢您提供信息。 实际上、我在应用中使用了 SO_KEEPALIVE、这里的问题是保持活动空闲时间周期。 默认情况下、它设置为72000、现在我已更改为100。 现在、我将看到应用程序套接字在10秒后关闭。

    此致

    巴拉

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

    您好 Gerardo、

    我还在控制台中收到“Retrasmit timeout”错误消息以及“保持活动”消息。 请找到快照。

    我正在为 应用程序使用以下 NDK_setsockopt()函数。 我认为这与 TCP 套接字设置有关。  

    int cmd_arg = 1;
    ret = setsockopt (s、SOL_socket、tcp_NODELAY、(char *)&cmd_arg、sizeof (cmd_arg));
    
    int cmd_arg = 0;
    ret = setsockopt (s、SOL_socket、SO_blocking、(char *)&cmd_arg、sizeof (cmd_arg));
    
    int cmd_arg = 0;
    ret = setsockopt (s、SOL_socket、SO_keepalive、(char *)&cmd_arg、sizeof (cmd_arg)); 

    我在_bind()和_connect()之间使用此设置。  

    您对此错误有什么建议吗?

    此致

    巴拉

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

    巴拉

    当 TCP 向网络对等设备发送数据包且对等设备在预期的时间内没有应答时,该消息将由 TCP 生成。 这几乎可以是任何东西;对等设备已关闭、网络繁忙、网络数据包已丢失或损坏等。

    此致、
    Gerardo

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

    我们是否可以在 NDK 中增加 TCP 超时间隔? 如果是、您可以在哪里找到我?


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

    巴拉

    NDK 不提供修改方法。 如果您确实需要、您可以进入代码并自行修改、但不建议这样做、我们将无法针对可能因代码而出现的任何问题提供支持。

    BR、
    Gerardo