【发布时间】:2016-02-23 08:52:37
【问题描述】:
我目前正在使用 OpenSSL 编写客户端。理想情况下,客户拥有例如4个线程等待从服务器读取,当一个线程读取时,它可能会执行一些工作,然后写入服务器并返回队列以从服务器读取。
OpenSSL 文档指出我不能在不同的线程中使用 SSL_read() 和 SSL_write()。然而SSL_read()是一个阻塞调用,我不能SSL_write()直到它返回?我知道我可以使用select 并执行非阻塞SSL_read(),但我发现这个解决方案不太理想。
OpenSSL 声明SSL_write() 可以返回SSL_ERROR_WANT_READ,从而使问题进一步复杂化。如果所有线程都想写,那么这将导致死锁。
我的问题是:如果我要在 SSL 连接上使用单独的输入和输出 BIO,是否可以在另一个线程写入输出 BIO 时从输入 BIO 进行阻塞读取?
欢迎任何其他建议,我还查看了 gnutls,它支持从多个线程对同一会话进行写入和读取。
【问题讨论】:
-
连接不是多线程的。如果您需要四个线程,则需要四个连接,除非您可以自己在它们之间进行仲裁和顺序化。
SSL_read()是一个阻塞调用意味着它阻塞,而不是你不能同时调用其他函数。因此,您关于死锁的陈述也是不合逻辑的。不清楚您在问什么。 -
如果我想在等待阻塞 SSL_read() 完成的同时使用 SSL_write(),这可能需要很长时间。
-
你从哪里得到的?如果正在进行握手,则接收和发送写入都将解除阻塞并返回适当的状态代码,如果不是,则发送可以与接收同时进行。
-
如文档所述,不能同时调用 SSL_read 和 SSL_write。因此,如果我需要从一个线程调用 SSL_read(),则不允许从另一个线程调用 SSL_write(),导致应用程序挂起。
-
所以你需要四个连接,正如我最初所说的那样。