我有两个线程,mainThreadrecvThread

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()吗?还是这是最好的解决方法?

解决此类问题的标准方法是什么?

谢谢你的时间。

最佳答案

文档中的报价似乎包含了答案:



The example of using the locking-related functions (github):

09-27 01:51