OpenSSlのmanページSSL_ *呼び出しの大部分は、値< = 0を返してエラーを示し、SSL_get_error()を呼び出して拡張エラーを取得することを推奨します。openssl(SSL_get_errorおよびERR_get_error)のエラーキューを管理する方法
しかし、これらの呼び出しのためのmanページ内だけでなく、他のOpenSSLライブラリの呼び出しのために、OpenSSLの中に「エラー・キュー」を使用することに漠然とした参照がある - そのような物はSSL_get_errorのmanページにケースです:
The current thread's error queue must be empty before the TLS/SSL I/O
operation is attempted, or SSL_get_error() will not work reliably.
そして、それは非常に同じmanページでは、SSL_ERROR_SSLの説明はこれを言う:
SSL_ERROR_SSL
A failure in the SSL library occurred, usually a protocol error.
The OpenSSL error queue contains more information on the error.
この種のは、読む価値がエラー・キューに何かがあることを意味します。それを読み取れないと、その後のSSL_get_errorの呼び出しが信頼できなくなります。おそらく、makeの呼び出しはERR_get_errorです。
私のコードでは、非ブロッキングソケットを使用する予定です。したがって、エラー状態がSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのときは確実に検出して、ソケットを正しいポーリングモードにすることが重要です。
だから私の質問はこれです:
SSL_get_errorは()私のために暗黙的にERR_get_error()を呼び出していますか?それとも両方を使う必要がありますか?
すべてのOpenSSLライブラリコールの前にERR_clear_errorに電話する必要がありますか?
OpenSSLライブラリ呼び出しの完了後、複数のエラーがキューに存在する可能性はありますか?したがって、キュー内の最初のエラーが最後のエラーよりも重要な状況がありますか?
最後の1つについて:はい、これは起こりうる。下位レベルにエラーがあり、キューにメッセージを追加する可能性があります。このエラーのために、ライブラリの上位レベルが独自のメッセージを追加します。場合によっては、スタック上に5つ以上のメッセージが表示されることがありました。 – javex
@ javex - 同意します。 – selbie