您好!
我正在设计一个系统、在该系统中、我们将有许多服务器连接到单个客户端(PC 应用程序)。 在一些边缘情况下、我认为我在服务器上执行的顺序错误、因此我正在寻找反馈。
要进行连接、我们具有以下序列:
- 加入网络:
- 进入站点模式(sl_WlanSetMode (Role_STA))
- sl_WlanConnect()
- 加入后、打开 TCP 端口:
- tcp_handle = sl_Socket (sl_AF_iNet、sl_sock_stream、0)
- sl_Bind(TCP_Handle,… )
- sl_listen (tcp_handle、...)
- comms_handle = sl_accept (tcp_handle,...) -阻止,直到 PC 建立连接
- 连接后,使用 sl_recv (comms_handle,...) 接收数据包、直到返回0、指示 PC 已关闭连接
- 然后、我们调用 sl_close (tcp_handle、...) 这是需要的吗?
- 从步骤2.d 开始、等待下一个连接
此序列在许多连接-发送数据-断开周期中重复工作正常。
但是、如果我在数据传输过程中关闭热点、sl_recv 永远不会返回0、因为 PC 应用程序无法正常关闭 TCP 连接。 不过,我们会检测网络的丢失,并调用 sl_close(),它将返回而不会出现错误。
此时、我们重新启动热点并成功重新加入网络。
然后、我们转到步骤2D 并调用 sl_accept (tcp_handle)、后者返回 sl_error_bsd_EBADF。 我想知道,如果 tcp_handle 资源由 sl_close()释放,则该句柄不再有效,我们应该从步骤2a 开始。 但是,当我尝试这样做时,我从 sl_Bind()中获得 sl_error_BSD_EADDRINUSE。
删除 sl_close()可以解决该问题。 但是、我担心这会导致我们尚未发现的不同问题。
如果您对该序列的错误位置有任何意见、我将不胜感激。
谢谢、
Katie
