C OpenSSL多线程读/写
我目前正在使用OpenSSL编写一个客户端。理想情况下,客户机有4个线程等待从服务器读取数据,当一个线程读取数据时,它可能会执行一些工作,然后向服务器写入数据并排队返回以从服务器读取数据 OpenSSL文档声明我不能从不同的线程使用C OpenSSL多线程读/写,c,openssl,C,Openssl,我目前正在使用OpenSSL编写一个客户端。理想情况下,客户机有4个线程等待从服务器读取数据,当一个线程读取数据时,它可能会执行一些工作,然后向服务器写入数据并排队返回以从服务器读取数据 OpenSSL文档声明我不能从不同的线程使用SSL\u read()和SSL\u write()。但是SSL\u read()是一个阻塞调用,我不能SSL\u write()直到它返回?我知道我可以使用select来执行非阻塞SSL\u read(),但我发现这个解决方案不太理想 OpenSSL指出SSL\u
SSL\u read()
和SSL\u write()
。但是SSL\u read()
是一个阻塞调用,我不能SSL\u write()
直到它返回?我知道我可以使用select
来执行非阻塞SSL\u read()
,但我发现这个解决方案不太理想
OpenSSL指出SSL\u write()
可以返回SSL\u ERROR\u WANT\u READ
,从而使问题进一步复杂化。如果所有线程都想写,那么这将导致死锁
我的问题是:如果我在SSL连接上使用单独的输入和输出BIO,那么当另一个线程正在向输出BIO写入时,是否可以从输入BIO执行阻塞读取
欢迎任何其他建议,我还研究了gnutls,它支持从多个线程写入和读取同一会话。不清楚您为什么说使用select和非阻塞套接字是次优解决方案
OpenSSL不允许SSL_读取和SSL_写入同时发生,因为握手可以由于重新协商请求而触发,并且握手状态不能在线程之间共享。类似地,非阻塞或其他错误信息存储在每个会话的单个变量中,当您在多个线程中使用相同的会话/连接时,可能会发生争用情况。在我的建议中,最好在单个线程中执行与一个SSL连接/会话相关的所有操作。如果您有多个连接,您可以生成线程来处理不同线程上的不同连接。不清楚您为什么说使用select和非阻塞套接字是次优解决方案
OpenSSL不允许SSL_读取和SSL_写入同时发生,因为握手可以由于重新协商请求而触发,并且握手状态不能在线程之间共享。类似地,非阻塞或其他错误信息存储在每个会话的单个变量中,当您在多个线程中使用相同的会话/连接时,可能会发生争用情况。在我的建议中,最好在单个线程中执行与一个SSL连接/会话相关的所有操作。如果有多个连接,则可以生成线程来处理不同线程上的不同连接。该连接不是多线程的。如果您需要四个线程,那么您需要四个连接,除非您可以自己在它们之间进行仲裁和排序
SSL\u read()
作为阻塞调用意味着它会阻塞,而不是不能并发调用其他函数。因此,您关于死锁的陈述也是不合理的。不清楚你在问什么。如果我想在等待阻塞SSL_read()完成时使用SSL_write(),可能需要很长时间。你从哪里得到的?如果正在进行握手,则接收和发送写入都将解除阻止并返回相应的状态代码,如果不是,则发送可以与接收同时进行。如文档所述,不能同时调用SSL_读取和SSL_写入。因此,如果我需要从一个线程调用SSL_read(),则不允许从另一个线程调用SSL_write(),从而导致应用程序挂起。因此,正如我最初所述,您需要四个连接。该连接不是多线程的。如果您需要四个线程,那么您需要四个连接,除非您可以自己在它们之间进行仲裁和排序SSL\u read()
作为阻塞调用意味着它会阻塞,而不是不能并发调用其他函数。因此,您关于死锁的陈述也是不合理的。不清楚你在问什么。如果我想在等待阻塞SSL_read()完成时使用SSL_write(),可能需要很长时间。你从哪里得到的?如果正在进行握手,则接收和发送写入都将解除阻止并返回相应的状态代码,如果不是,则发送可以与接收同时进行。如文档所述,不能同时调用SSL_读取和SSL_写入。因此,如果我需要从一个线程调用SSL_read(),我不允许从另一个线程调用SSL_write(),从而导致应用程序挂起。