我有一个包装 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/