2011-01-04 7 views
0

У меня есть асинхронное клиентское и серверное приложение, которое переносит 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, где состояние не установлено правильно? Или я чего-то не хватает?

+0

Пожалуйста, объясните: что BIO является m_pOutBio? На какой стороне (сервер или клиент) работает этот код? –

+0

Это выполняется на стороне клиента. Как серверная, так и клиентская сторона терпят неудачу при вызове BIO_ctrl_pending(). Когда я вызываю BIO_read() напрямую, он возвращает вышеупомянутую ошибку SSL. M_pOutBio создается с использованием: \t \t m_pOutBio = BIO_new (BIO_s_mem()); – MarkP

+0

Внутри SSL функция SSL_peek() вызывает s-> handshake_func, где s - мой объект SSL *. Интересно, имеет ли это какое-либо отношение к загрузке BIO. – MarkP

ответ

2

Старый вопрос, но продолжает появляться, когда прибегая к помощи OpenSSL вещи, так для справки:

Просто начать рукопожатие вместо того, чтобы полагаться на заглядывать/читать делает его внутренне: Если это не сокет био рукопожатия проваливается с 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); 
Смежные вопросы