C语言 OpenSSL 多线程读/写



我目前正在使用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,它支持从多个线程写入和读取同一会话。

目前还不清楚为什么您说使用带有非阻塞套接字的 select 对您来说是一个次优的解决方案。

OpenSSL 不允许同时发生SSL_read和SSL_write,因为握手可能会因重新协商请求而触发,并且握手状态无法在线程之间共享。同样,非阻塞或其他错误信息存储在每个会话的单个变量中,当您在多个线程中使用相同的会话/连接时,可能会出现争用情况。在我的建议中,最好在单个线程中执行与一个SSL连接/会话相关的所有操作。如果您有多个连接,则可以生成线程来处理不同线程上的不同连接。

最新更新