我有两个帖子,mainThread
和recvThread
。
在recvThread
,我致电SSL_read(ssl, readBuffer, sizeof(readBuffer))
。这会阻塞线程,直到收到数据。
然后,在mainThread
我被告知需要发送一些数据。所以,我打电话给SSL_write(ssl, someData, sizeof(someData))
。
有时,这很好用。其他时候,这会因为内部错误消息错误而失败。我的猜测是,在同一ssl
上下文中发生SSL_read时,我无法调用SSL_write。这对我来说很有意义,但我该如何解决呢?
我是否recvThread
做了类似的事情:
SSL * ssl;
std::string data;
boost::mutex dataMutex;
while (recvThreadShouldBeRunning) {
char readBuffer[100];
auto nRead = SSL_read(ssl, readBuffer, sizeof(readBuffer)); //Non-blocking call to SSL_read.
// Do something with nRead (handle errors, use data)
{
auto dataLock = boost::unique_lock<boost::mutex>(dataMutex);
if (data.length() > 0)
{
SSL_write(ssl, data.c_str(), data.length());
}
}
sleep(50);
}
然后我需要发送东西......
{
auto dataLock = boost::unique_lock<boost::mutex>(dataMutex);
data = "some data";
}
这似乎会起作用,但我认为这对我的问题来说是一个相当难看的解决方案。有办法以某种方式SSL_lock()
SSL_wait_on_data()
SSL_unlock()
吗?或者这是最好的方式吗?
解决此类问题的标准方法是什么?
感谢您的时间。
答案 0 :(得分:2)
文档中的引用似乎包含答案:
OpenSSL可以安全地用于多线程应用程序,前提是至少设置了两个回调函数,lock_function和threadid_func。
需要
locking_function(int mode, int n, const char *file, int line)
来执行对共享数据结构的锁定。 (请注意,OpenSSL使用许多全局数据结构,只要多个线程使用OpenSSL,就会隐式共享它们。)如果没有设置,多线程应用程序将随机崩溃。
locking_function()
必须能够处理最多CRYPTO_num_locks()
个不同的互斥锁。它会设置mode
&amp;的第n个锁。CRYPTO_LOCK
,然后以其他方式发布。
file
和line
是设置锁定的函数的文件号。它们可用于调试。
The example of using the locking-related functions (github):
crypto / threads / mttest.c显示了Solaris,Irix和Win32上的回调函数示例。