Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OpenSSL多线程读/写_C_Openssl - Fatal编程技术网

C 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

我目前正在使用OpenSSL编写一个客户端。理想情况下,客户机有4个线程等待从服务器读取数据,当一个线程读取数据时,它可能会执行一些工作,然后向服务器写入数据并排队返回以从服务器读取数据

OpenSSL文档声明我不能从不同的线程使用
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(),从而导致应用程序挂起。