2011-01-04 22 views
0

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のバグですか?または私は何かが欠けている?

+0

を説明してください:m_pOutBio BIO何ですか?このコードが実行されている側(サーバーまたはクライアント)は何ですか? –

+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のものをグーグルときポップアップ続け:

ちょうど内部でそれをやって読み/ハンドシェイクを開始する代わりに、PEEKに頼る: それはソケットバイオない場合は握手を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);