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.

[参考译文] SIMPLELINK-CC32XX-SDK:使用 TCP 套接字通过 Telnet 连接的多个会话

Guru**** 2560010 points
Other Parts Discussed in Thread: CC3235MODSF, SIMPLELINK-CC32XX-SDK

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1044661/simplelink-cc32xx-sdk-multiple-sessions-with-telnet-connection-using-tcp-socket

器件型号:SIMPLELINK-CC32XX-SDK
主题中讨论的其他器件:CC3235MODSF

您好!

我们使用以下组件将应用程序作为 TCP 客户端进行开发:

   具有 CC3235MODSF 的定制硬件
   SIMPLELINK-CC32XX-SDK 版本:5.20.00.06
   Service Pack 版本:4.11.0.0

我们使用 Simplelink API 通过 Telnet 连接到服务器。 Telnet 协商后,应用程序只是一个终端仿真器。 下面是我们打开套接字的方法:

/* Create a client socket for telnet. */
sd = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, 0);
/* Try to connect to server. */
sl_Connect(sd, (SlSockAddr_t *)&addr, sizeof(SlSockAddr_t));
/* Block socket to receive first byte. */
rs = sl_Recv(sd, gp_buff, 1, 0);

当我们从套接字收到错误时、会发生问题。 有时、即使我们阻止套接字接收1个字节、sl_Recv 也返回0。 在这种情况下、我们必须通过调用 sl_close 来关闭套接字、然后再次将其打开。 但是、这会导致服务器端出现多个会话。 我们的一位客户已警告我们该问题、因为这些多个会话会导致其机器上的 RAM 使用量不必要地增加。

为什么您认为插座没有正确关闭? 我们是否可以通过某种方式确保我们的器件成功关闭插槽?

感谢你的帮助。

最棒的

欧格尔肯

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

    当远程端关闭连接(即发送了 TCP-FIN、这意味着他停止了 TX)时、SL_Recv 返回0。

    您需要关闭套接字以响应连接终止(调用 sl_close 将 告知 CC32xx 发送其 TCP-FIN 并启用远程侧以释放套接字资源)。

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

    您好、Kobi、

    感谢您提供信息。 但是、这正是我们现在处理通信的方式。 即使我们调用 sl_close、会话也会在服务器端打开。

    您能想到我们可以测试的其他解决方案吗?

    谢谢。

    欧格尔肯

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

    sl_close 后 sl_Stop 的情况也是如此? 您是否认为有必要结束课程?

    谢谢。

    欧格尔肯

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

    您好、Ogulcan、

    只是简单的评论。

    根据您的描述、它看起来像是服务器端的错误行为。 服务器似乎无法正确处理关闭的套接字。 为了更深入地了解、请提供网络监听器的日志-例如 Wireshark 的数据包日志。 也许您可以在关闭套接字之前尝试使用套接字选项 linger。

    在 sl_close ()之后调用 sl_Stop()并不是强制的在 sl_close()之后立即调用 sl_Stop()可能会导致关闭套接字时出现问题,特别是在使用带有短时间或没有超时的 sl_Stop()时。

    1月

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

    您好、Jan、

    非常感谢您的评论。

    我将尝试从 Wireshark 获取日志数据、并与客户一起调试此问题。 在关闭插槽之前、我还将尝试使用插槽选项 linger。

    您建议在 sl_close 之后等待多长时间以调用 sl_Stop?  因为我们在某些情况下会停止与服务器的通信并停止 Simplelink 进入休眠状态。

    谢谢。

    欧格尔肯

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

    您好、Ogulcan、

    很难建议关闭套接字和禁用 NWP 之间的时间。 因为这取决于本地条件(服务器延迟)。 它始终是折衷的。 如果在调用 sl_close()后立即禁用 NWP,则可能无法在服务器端正确关闭套接字。 如果您等待更长时间、您将浪费能源。 使用 linger 选项是一种合理的方法。 但您需要正确 调整超时。

    如果您的应用对功耗很敏感、则使用短超时可能是合理的方法。 并在服务器端正确实施资源释放(对于未正确关闭的套接字)。 我想在服务器端的硬件比 CC3235内的 Cortex-M4强大得多:)

    1月

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

    您好、Jan、

    非常感谢您的详细解释。 我们将测试 LINGER 选项和不同的超时值、以找到最佳解决方案。

    不过、还有一个有关超时值的问题。 让我们假设我们为 sl_Stop 提供了很长的超时时间、例如5000毫秒。 在这种情况下、sl_Stop 的行为是怎样的? 它是在套接字关闭后立即返回还是等待满5000毫秒后返回?

    是的,实际上服务器端的硬件必须比 CC3235强大得多:)

    最棒的

    欧格尔肯

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

    您好、Ogulcan、

    很遗憾,我不确定 sl_Stop()在与 TCP 套接字关闭数据包交换结合时的确切行为是什么。 NWP 停止超时通常以这种方式工作、尽快进入 NWP 休眠状态-这意味着完成了所有必要的"清理"(例如完成了关闭闪存写入等)。 断电时间不能超过超时。 但我不确定是否考虑了关闭套接字。 您可以自己对此进行测试、也可以等待 TI 的回答

    1月

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

    您好、Kobi、

    您能否根据我之前的问题确认函数 sl_Stop 的行为? 函数是在 NWP 完成所有必要任务后立即返回还是等到给定的超时值结束才返回?

    谢谢。

    欧格尔肯

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

    sl_close 将在套接字关闭后立即返回。 超时将仅用于较差的情况(例如,连接未正常关闭)。

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

    非常感谢您的帮助。

    最棒的

    欧格尔肯