我将使用 CC3220S 与服务包#sp_3.5.0.0_2.0.0.0_2.2.0.5.bin 和 SDK v1.50.00.06来开发 TCP 服务器应用。 应用程序中有两个 TCP 服务器(两个不同的端口)。 程序工作正常、但我正在尝试改进代码、以便在客户端与端口断开连接时自动重新启动 TCP 服务器。 下面是我尝试和观察的内容:
1.其中一台 TCP 服务器从客户端接收固定数量的数据包,然后客户端应关闭端口连接。 我需要重新启动 TCP 服务器、以便它将来可以再次接受客户端连接。
- 我使用 的是 SL_Recv、具有上的阻止选项(SL_SO_NONBLOCKING 设置为0)。
- 当我完成收集所有数据包后、我对 sl_Recv 进行额外调用、直到它返回0。
- 然后我调用 sl_close
- 在此之后、我的代码重新启动 TCP 服务器(sl_Socket、sl_Bind、sl_Listen)以等待客户端进行下一次连接。
我观察到、如果我没有在 sl_close 和随后的 sl_Bind 之间放置明显的延迟、sl_Bind 将返回 SL_ERROR_BSD_EADDRINUSE。 如果我在 sl_close 和 sl_Bind 之间放置了一个明显的延迟、那么它看起来是正确的。
问题:是否预计同一端口地址的 sl_close 和后续 sl_Bind 之间需要延迟? 在调用 sl_Bindd 之前、是否有更好的方法来检查地址状态?
2.我的另一台 TCP 服务器使用 sl_Send 将数据包无限期传输到客户端。 当然、客户端可以随时断开与端口的连接、我希望通过重新启动 TCP 服务器从这种情况中恢复。
- 我正在使用 sl_Send、并且我已配置为阻止(sl_SO_NONBLOCKING 设置为0)。
- 当客户端断开连接时、sl_Send 返回 SL_ERROR_BSD_SOC_ERROR。
- 然后我尝试调用 sl_close、但 sl_close 调用永远不会返回。
问题:为什么 sl_close 不返回? 是否有更好的方法来处理这种情况?
谢谢、
Ruben