SSL读取和SSL同时写入

时间:2014-02-03 12:15:32

标签: c++ multithreading sockets ssl

我有两个帖子,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()吗?或者这是最好的方式吗?

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

感谢您的时间。

1 个答案:

答案 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,然后以其他方式发布。

     

fileline是设置锁定的函数的文件号。它们可用于调试。

     

- threads - OpenSSL

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

  

crypto / threads / mttest.c显示了Solaris,Irix和Win32上的回调函数示例。

     

- threads - OpenSSL