BIO_ctrl_pending()的异步OpenSSL问题

时间:2011-01-04 22:06:47

标签: 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中的某种错误,其中状态未正确设置?或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

旧问题但在谷歌搜索openssl时不断弹出,所以参考:

只需启动握手而不是依赖peek / read在内部执行: 如果它不是套接字生物,则握手将失败并使用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);