我有两个线程,mainThread和recvThread。
在recvThread上,我给SSL_read(ssl, readBuffer, sizeof(readBuffer))打电话。这会阻塞线程,直到收到数据为止。
然后,在mainThread上,我被告知需要发送一些数据。所以,我叫SSL_write(ssl, someData, sizeof(someData))。
有时候,这个很好用。其他情况下,这在内部错误消息中失败。我的猜测是,在同一个SSL_write上下文中发生SSL_read时,我不能调用ssl。这对我来说完全是有意义的,但我该如何解决呢?
我是否让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()?或者说这是最好的方法?
解决这类问题的标准方法是什么?
耽误您时间,实在对不起。
发布于 2015-06-30 23:53:19
从文件中引用的话似乎包含了答案:
OpenSSL可以安全地应用于多线程应用程序,只要设置了至少两个回调函数,即locking_function和threadid_func。 需要
locking_function(int mode, int n, const char *file, int line)对共享数据结构执行锁定。(请注意,OpenSSL使用了许多全局数据结构,只要多个线程使用OpenSSL,就会隐式地共享这些数据结构。)如果没有设置多线程应用程序,就会随机崩溃。locking_function()必须能够处理CRYPTO_num_locks()不同的互斥锁。如果是mode&CRYPTO_LOCK,则设置n个锁,否则就释放它.file和line是设置锁的函数的文件号。它们对于调试非常有用。 -- 线程- OpenSSL。
C显示Solaris、Irix和Win32上回调函数的示例。 -- 线程- OpenSSL。
https://stackoverflow.com/questions/21527206
复制相似问题