非阻塞套接字是否仍然可以在OpenSSL中阻塞?

时间:2015-02-17 13:28:14

标签: openssl nonblocking

我还没有得到这个问题的明确答案。

如果我使用非阻塞套接字,可以调用SSL_read还是写入静止块? 如果我在没有什么要读的时候调用SSL_read,它会立即返回吗?

SSL_write(16kb)需要什么样的时间?你能依靠最糟糕的情况还是可以改变很多?

我有4ms的周期,我必须做的事情,所以我不能读取或写入超过那个,是不可能实现可靠的?

1 个答案:

答案 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