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.

[参考译文] CC3100MODBOOST:当套接字关闭时、recv()不会返回

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/874822/cc3100modboost-recv-doesn-t-return-when-socket-is-closed

器件型号:CC3100MODBOOST
Thread 中讨论的其他器件:CC3200

我在 收发器模式下使用 CC3100MODBOOST 板、连接到另一个开发板。  当接收到套接字错误时、我在套接字事件处理程序 sl_sockEvtHdlr()的上下文中关闭套接字。  当套接字关闭时,等待在该套接字上接收数据的线程在 recv()调用中仍然被阻止。

我希望 recv()中止并返回。

处理这种情况的最佳方法是什么?  我是否可以强制 recv()返回另一种方式?

固件和驱动程序版本:

ID (67108864) FW (31.1.0.5.0.2) PHY (1.0.3.37)
NWP (2.11.0.1) ROM (13107) HostDrv (1.0.1.11)

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

    您好!

    主机驱动程序 CC3200/C3100器件不能处理来自异步事件或中断上下文的 SL_ API 调用。 您应该仅从线程上下文中调用 SL_ API、并使用异步事件为线程进行签名。

    在您的情况下,在从 recv() API 调用获得错误响应后,您应该从调用 recv()时的同一个线程调用 close()。

    1月

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

    我不确定您是否捕获到了该错误,但这是一个 TX 错误事件,当另一个线程位于同一套接字的 recv()上时会发生该错误事件。  recv 没有返回错误。  实际上、即使发生了 TX 错误事件、在收发器模式下、我也能继续收到原始 WiFi 消息、而不会出现错误。

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

    后续操作:在线程上下文中对套接字 close _is 进行调用。  它是_slEventGenericHandler 的黎明上下文。  您如何知道在这种情况下套接字无法关闭?  您能向我介绍一下该部分文档吗?

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

    其他后续操作: 从_SlEventGenericHandler 调用 sl_close()时,对 sl_close()的调用看起来根本不会返回。  我以前没有意识到这一点。

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

    您好!

    是的、我在第一个回答中说过、除非您不想看到意外行为、否则无法从异步处理程序调用 sl_ API。

    通常不是从具有相同套接字的不同线程调用 recv()或 send()的最佳方法。 如果您不担心功耗、则最好对每个打开的插座使用一个任务、并使用非阻塞式插座。

    1月

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

    看起来我需要进行一些重新架构来利用非阻塞套接字。  感谢您的指导。