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

Posted

技术标签:

【中文标题】非阻塞套接字仍然可以在 OpenSSL 中阻塞吗?【英文标题】:Can non blocking sockets still block in OpenSSL? 【发布时间】:2015-02-17 13:28:14 【问题描述】:

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

如果我使用非阻塞套接字,对 SSL_read 或 write 的调用是否仍会阻塞? 如果我在没有内容可读取的情况下调用 SSL_read,它会立即返回吗?

SSL_write(16kb) 需要多少时间?您可以依靠最坏的情况还是这种情况会发生很大变化?

我有 4 毫秒的周期,我必须做一些事情,所以我不能进行超过该周期的读取或写入,这不可能可靠地实现吗?

【问题讨论】:

【参考方案1】:

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_get_error SSL_read() 的返回值将产生 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE。在任何时候都可能重新谈判, 调用 SSL_read() 也会导致写操作!呼唤 然后流程必须在采取适当措施后重复调用 满足 SSL_read() 的需求。行动取决于底层 生物。当使用非阻塞套接字时,什么都不做,但是 select() 可用于检查所需条件。当使用一个 缓冲 BIO,就像 BIO 对一样,必须写入或检索数据 在能够继续之前退出 BIO。

如果您想知道 SSL_write 执行一定数量的字节需要多长时间,那么您必须对其进行测试。还可以在不同的系统上对其进行测试,以了解它所花费的一般时间,除非您总是让相同的系统运行您的代码,我对此表示怀疑。

看看这个 SO 帖子。知道如何实现 SSL 的 Remy 回答了这个问题:How to handle OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE on non-blocking sockets

【讨论】:

以上是关于非阻塞套接字仍然可以在 OpenSSL 中阻塞吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以很好地解释非阻塞套接字的“发送”行为吗?

非阻塞套接字轮询与阻塞套接字

我可以使用非阻塞套接字使用“sendmsg/recvmsg”将 FD 从一个进程发送到另一个进程吗?

select() 可以与阻塞套接字一起使用吗?

当非阻塞 send() 只传输部分数据时,我们可以假设它会在下一次调用时返回 EWOULDBLOCK 吗?

java同异步请求和阻塞非阻塞的区别