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