非阻塞套接字仍然可以在 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 从一个进程发送到另一个进程吗?