OpenSSL을 감싸는 비동기 클라이언트 및 서버 응용 프로그램이 있습니다. 일단 생성되면 SSL_set_connect_state()/SSL_set_accept_state()를 각각 호출하여 내부 상태를 초기화합니다. 이 시점까지는 모든 것이 실행되어야합니다. 나는 앞서 언급 한 상태가 설정되면 손 떨림이 시작될 수 있다고 가정합니다. 나는 손동작 (스 니펫)을 초기화하기 위해 다음을 수행한다.비동기 BIO_ctrl_pending()을 사용한 OpenSSL 문제
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가 반환됩니다. 그런 다음 분명히 내 독서 코드를 실행하지 않습니다. 내가 코드, BIO_ctrl_pending()를 적당량 (210)를 반환하고 내 코드는 다음 BIO에서 읽을 계속 손을 흔들어 시작할 수 있습니다 실행할 때 이제
SSL_peek(m_pSSLCon, NULL, 0);
: 내 코드 위에 다음 줄을 추가했다.
제 질문은 OpenSSL에서 상태가 올바르게 설정되지 않는 버그입니까? 또는 나는 무엇인가 놓치고있다??
설명하십시오 : m_pOutBio BIO 무엇인가? 이 코드는 어떤 측면 (서버 또는 클라이언트)에서 실행됩니까? –
이것은 클라이언트 측에서 실행됩니다. 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