我还没有得到这个问题的明确答案。
如果我使用非阻塞套接字,可以调用SSL_read还是写入静止块? 如果我在没有什么要读的时候调用SSL_read,它会立即返回吗?
SSL_write(16kb)需要什么样的时间?你能依靠最糟糕的情况还是可以改变很多?
我有4ms的周期,我必须做的事情,所以我不能读取或写入超过那个,是不可能实现可靠的?
答案 0 :(得分:2)
SSL_read的文档说明:
SSL_read()的行为取决于底层BIO。
和
如果底层BIO阻塞,SSL_read()将只返回一次 读取操作已完成或发生错误,除非 重新协商发生,在这种情况下,SSL_ERROR_WANT_READ可以 发生。可以使用SSL_MODE_AUTO_RETRY控制此行为 SSL_CTX_set_mode调用的标志。
如果底层BIO是非阻塞的,SSL_read()也将返回 当底层BIO无法满足SSL_read()的需求时 继续行动。在这种情况下用SSL调用SSL_get_error SSL_read()的返回值将产生SSL_ERROR_WANT_READ或 SSL_ERROR_WANT_WRITE。在任何时候都可以进行重新谈判,a 调用SSL_read()也会导致写操作!呼唤 然后,在采取适当的行动后,必须重复调用 满足SSL_read()的需求。行动取决于潜在的 BIO。使用非阻塞套接字时,不需要做任何事情,但是 select()可用于检查所需的条件。使用时 缓冲BIO,就像BIO对一样,必须写入或检索数据 在能够继续之前离开BIO。
如果您想知道SSL_write执行一定数量的字节需要多长时间,那么您必须对其进行测试。还要在不同的系统上进行测试,以了解所需的一般时间,除非你总是有相同的系统运行你的代码,我怀疑。
看看这篇SO帖子。 Remy是一位知道如何实施SSL的人:How to handle OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE on non-blocking sockets