【问题标题】:SSL read and SSL write simultaneouslySSL 读取和 SSL 写入同时进行
【发布时间】:2014-02-26 22:19:18
【问题描述】:

我有两个线程,mainThreadrecvThread

recvThread,我打电话给SSL_read(ssl, readBuffer, sizeof(readBuffer))。这会阻塞线程,直到接收到数据。

然后,在mainThread 上,我被告知需要发送一些数据。所以,我打电话给SSL_write(ssl, someData, sizeof(someData))

有时,这很好用。其他时候,这会因奇怪的内部错误消息而失败。我的猜测是,当 SSL_read 在同一个 ssl 上下文中发生时,我不能调用 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()?或者这是最好的方法?

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

感谢您的宝贵时间。

【问题讨论】:

  • 你看过了吗? OpenSSL threads
  • 请注意,套接字提供者不保证两个不同的线程可以同时在同一个套接字上读写。但它似乎有效。
  • @brianbeuning TCP 保证了这一点。这是一个全双工连接。
  • @EJP 恐怕无论 TCP 保证什么,SSL 都不能保证......正如我所说,我只是在某些时候遇到奇怪的内部错误,这很好地表明了线程问题。所以通常使用winsock,你会做我现在正在做的事情,对吧?那可以吗?

标签: c++ multithreading sockets ssl


【解决方案1】:

文档中的引用似乎包含了答案:

只要设置了至少两个回调函数,locking_function 和 threadid_func,OpenSSL 就可以安全地用于多线程应用程序。

需要locking_function(int mode, int n, const char *file, int line) 才能对共享数据结构执行锁定。 (请注意,OpenSSL 使用许多全局数据结构,只要多个线程使用 OpenSSL,这些数据结构就会隐式共享。)如果未设置,多线程应用程序将随机崩溃。

locking_function() 必须能够处理多达CRYPTO_num_locks() 不同的互斥锁。如果mode & CRYPTO_LOCK 则设置第n 个锁,否则释放它。

fileline是设置锁的函数的文件号。它们对于调试很有用。

-- threads - OpenSSL.

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

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

-- threads - OpenSSL.

【讨论】:

  • 这并不意味着您可以同时读取/写入同一个 SSL 句柄。
猜你喜欢
  • 2011-12-05
  • 2011-02-03
  • 2017-04-17
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多