我有一个包装 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 中没有正确设置状态的某种错误吗?还是我错过了什么?