4.4 网络阻塞与非阻塞机制 mbedtls在电脑模拟测试时其网络连接非常顺畅,而且测试只是跑这一项功能,即使采用阻塞模式也不会有其它问题。实际嵌入式设备在联网时,肯定还有其他任务需要执行。 如果设备支持操作系统,可以为mbedtls单独分配一个线程或者任务,推荐使用阻塞机制实现接口,而且容易调试,尤其是https下载这种场景。但是特殊情况下不支持阻塞的,在改写网络接口时,需要特殊处理。 例如范例mbedtls_net_connect进行域名解析、连接服务器,嵌入式设备的无线网络在这个步骤,基本会返回异常表示阻塞等待中,要解决这个问题,需要将后续的握手流程拆分执行。原本联网后执行mbedtls_ssl_handshake,在while里面等待握手流程MBEDTLS_SSL_HANDSHAKE_OVER结束或者错误,改为每次收到读消息的事件,执行一次或多次mbedtls_ssl_handshake_step。(这个并没亲自验证) mbedtls_ssl_set_bio注册的读写接口支持设为非阻塞,mbedtls_ssl_write和mbedtls_ssl_read对应用层接口,在底层socket上报read_ready之后,判断当前握手已经完成,再执行mbedtls_ssl_read。
|