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:NDK 套接字

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595697/rtos-ndk-sockets

工具/软件:TI-RTOS

您好!

 我已设置 TCP 服务器并启用 套接字的选项: SO_RCVTIMEO、SO_SNDTIMEO。

我用标志 MSG_WAITALL 来调用 recv() ,我注意到 recv()没有超时(即在用 SO_RCVTIMEO recv()定义的时间之后,仍然是 blocks())

从我读取的内容中,我找不到明确的答案,但它听起来似乎超时选项应该有效,如果设置,即使在 recv()中使用 MSG_WAITALL 也是如此。

我还尝试从 recv()中删除 MSG_WAITALL (将 flags 参数设置为0),但仍然会永久阻止 recv(),而不会出现任何超时。

您能否解释(或帮助解决) 为什么超时不保持?

谢谢  

家伙

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用什么值来进行超时? 您是否让内核创建默认的1ms 时钟节拍? 您可以在 ROV->Clock 中确认这一点。 如果您运行时钟节拍提前、请查看 ROV 中的节拍计数、运行、然后再次查看 ROV 中的节拍计数。

    此外、您使用的 NDK 版本是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我查看了 ROV 及其计时。

    至于超时、套接字选项设置如下:

    struct timeval tv;
    tV.tV_sec = 5;
    tV.tV_usec = 0;
    setsockopt (hSock、SOL_Socket、SO_RCVTIMEO、&tv、sizeof (tv));

    我还会检查 setsockopt 是否返回而没有错误。

    NDK 版本 I 使用- 2.24.2.31

    谢谢
    家伙
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 我明天在办公室时会查看这一点。 很抱歉、我忘记问您使用的是什么设备?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我正在处理 TDA3xx (特定代码位于 ARM M4上)

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

    大家好、

    我用2.24.02.31 (再次用2.25.00.09)尝试了一个示例、它运行良好。 我将 SO_RCVTIMEO 和 SO_SNDTIMEO 设置为5秒。 我的笔记本电脑发送了一个 TCP 数据包(在端口1000上)、目标刚刚回显。 我让笔记本电脑停止发送一个位、但没有关闭插座。 我检查(通过 Wireshark)目标在5秒内关闭了插座。  

    这是我用于测试的主要源文件。

    e2e.ti.com/.../tcpEcho.c

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢你的帮助。
    这是我的错误-我的客户端在超时过期之前关闭了套接字、因此服务器端接受的套接字永远不会有实际超时的机会。 我更改了客户端、确实发生了超时。

    关于您发送的代码-为什么要设置 SO_KEEPALIVE 选项-您能解释一下吗(根据我的理解、它只是让 TCP 在一段时间后发送 KEEPALIVE 数据包(不确定这次是什么) 当没有交通信息、但我不确定是否和/或为什么需要)

    还有一件事- strerror 函数似乎不知道套接字错误代码(即、对于超时、它会打印未知错误)- NDK 中是否有其他函数可用于获取套接字错误的字符串形式?

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

    so_keepalive 选项位于我调整的示例中。 我希望它在那里用于测试目的。 默认发送时间为2小时。 如果 recv/send API 上没有超时、它有助于确保事件仍然有效。

    我看不到等效的 strerror。 我向其中一位 NDK 工程师发出了命令。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们没有等效的 API。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的帮助。

    家伙