У меня есть асинхронное клиентское и серверное приложение, которое переносит OpenSSL. После их создания они вызывают SSL_set_connect_state()/SSL_set_accept_state() соответственно для инициализации своего внутреннего состояния. До этого момента все работает так, как должно быть. Я предполагаю, что после того, как будут установлены вышеупомянутые состояния, начнется дрожание рук. Я делаю следующее, чтобы инициализировать дрожание рук (фрагмент):Проблема Async OpenSSL с BIO_ctrl_pending()
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, где состояние не установлено правильно? Или я чего-то не хватает?
Пожалуйста, объясните: что BIO является m_pOutBio? На какой стороне (сервер или клиент) работает этот код? –
Это выполняется на стороне клиента. Как серверная, так и клиентская сторона терпят неудачу при вызове BIO_ctrl_pending(). Когда я вызываю BIO_read() напрямую, он возвращает вышеупомянутую ошибку SSL. M_pOutBio создается с использованием: \t \t m_pOutBio = BIO_new (BIO_s_mem()); – MarkP
Внутри SSL функция SSL_peek() вызывает s-> handshake_func, где s - мой объект SSL *. Интересно, имеет ли это какое-либо отношение к загрузке BIO. – MarkP