首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSL读和SSL写同时

SSL读和SSL写同时
EN

Stack Overflow用户
提问于 2014-02-03 12:15:32
回答 1查看 2.3K关注 0票数 4

我有两个线程,mainThreadrecvThread

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

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

有时候,这个很好用。其他情况下,这在内部错误消息中失败。我的猜测是,在同一个SSL_write上下文中发生SSL_read时,我不能调用ssl。这对我来说完全是有意义的,但我该如何解决呢?

我是否让recvThread做这样的事情:

代码语言:javascript
复制
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);
}

然后当我需要发送一些东西..。

代码语言:javascript
复制
{
    auto dataLock = boost::unique_lock<boost::mutex>(dataMutex);
    data = "some data";
}

这似乎是可行的,但我认为这是一个相当丑陋的解决方案,我的问题。有没有办法让SSL_lock() SSL_wait_on_data() SSL_unlock()?或者说这是最好的方法?

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

耽误您时间,实在对不起。

EN

回答 1

Stack Overflow用户

发布于 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个锁,否则就释放它. fileline是设置锁的函数的文件号。它们对于调试非常有用。 -- 线程- OpenSSL

使用与锁定相关的函数(github)的示例

C显示Solaris、Irix和Win32上回调函数的示例。 -- 线程- OpenSSL

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21527206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档