我目前正在使用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,它支持从多个线程写入和读取同一个会话。
答案 0 :(得分:2)
目前还不清楚为什么你说使用带有非阻塞套接字的select对你来说是次优解决方案。
OpenSSL不允许同时发生SSL_read和SSL_write,因为重新协商请求可以触发握手,并且不能跨线程共享握手状态。类似地,非阻塞或其他错误信息存储在每个会话的单个变量中,并且当您在多个线程中使用相同的会话/连接时,可能发生竞争条件。在我的建议中,最好在单线程中完成与一个SSL连接/会话相关的所有操作。如果您有多个连接,则可以生成线程来处理不同线程上的不同连接。