c++ - BIO_ctrl_pending() 的异步 OpenSSL 问题

标签 c++ openssl asyncsocket

我有一个包装 OpenSSL 的异步客户端和服务器应用程序。一旦创建,它们分别调用 SSL_set_connect_state()/SSL_set_accept_state() 来初始化它们的内部状态。到目前为止,一切都在正常运行。我假设一旦设置了上述状态,就可以开始握手。我执行以下操作来初始化所说的握手(片段):

if (BIO_ctrl_pending(m_pOutBio))
{
    size_t iNumBytes = BIO_ctrl_pending(m_pOutBio);
    if (iNumBytes > 0)
    {
        CAutoPtr<byte> tTempBuf(new byte[iNumBytes]);

        // Transfer bytes from the Write BIO into the temporary buffer
        int iRet = BIO_read(m_pOutBio, tTempBuf, iNumBytes);
    }
}

这就是有趣的地方。 BIO_ctrl_pending() 调用失败,当我对其执行 SSL_get_error() 时,它返回 SSL_ERROR_WANT_READ。然后它显然不会不执行我的阅读代码。我在我的代码片段上方添加了以下行:

SSL_peek(m_pSSLCon, NULL, 0);

现在,当我运行代码时,BIO_ctrl_pending() 返回适当的数量 (210),然后我的代码可以继续从 BIO 读取并启动握手。

我的问题是,这是 OpenSSL 中状态未正确设置的某种错误吗?或者我错过了什么??

最佳答案

老问题,但在谷歌搜索 openssl 东西时不断弹出,因此供引用:

只需发起握手,而不是依赖于在内部进行 peek/read 操作: 如果它不是套接字 bio,握手将失败并显示 ssl_error_want_read,然后您使用 ctrl_pending 获取要读取的大小。

像这样:

    ret = SSL_do_handshake(client_side);
      if (ret < 0)
        if (SSL_ERROR_WANT_READ !=  SSL_get_error(client_side,ret))
            cout << "ERROR";


    ret = BIO_ctrl_pending(network_side); 

关于c++ - BIO_ctrl_pending() 的异步 OpenSSL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4598956/

相关文章:

C# 异步 Web 服务器 - 如何将数据发送到客户端

c++ - 在 .cpp 或 .h 中包含头文件的最佳方法是什么?

c++ - 我如何在客户端支持多个版本的 TLS?

ios - 为什么使用dispatch_async()方法时AsyncSocket无法连接到主机?

python - Databricks 群集未初始化 Azure 库,错误为 : module 'lib' has no attribute 'SSL_ST_INIT'

rubygems - JRuby OpenSSL 错误

c# - SendAsync 运行但数据并未真正发送

c++ - 计算独特项目的更好方法

c++ - 为什么STL Set会覆盖具有相同值的对

C++:使用 isdigit 检查字符串字符是否为数字。 .