OpenSSLをCで大量に使用するマルチスレッドアプリケーションがあります。すべてのSSL接続がブロックされると考えられています。具体的には、BIOをブロックする。彼らはすべてこのように、単一の着信ポートをオフに割り当てられます。OpenSSL BIOをブロッキングモードからノンブロッキングモードに変更する
ssl = SSL_new(ctx);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
sock = BIO_new_socket(socket, BIO_CLOSE);
SSL_set_bio(ssl, sock, sock);
が、それはしかし結局のところ、最良の選択となり、非ブロッキングBIOSを使用して、コードベースのいくつかの小さな部分があります。ノンブロッキングBIOの恩恵を受ける小さな部分は、どのSSL接続がそれらに属しているかを知る方法がありません。したがって、彼らは常にBIOをブロックします。
問題は、ブロッキングBIOを非ブロッキングに変更できますか?
私はBIO_set_nbioはBIOが非ブロックにするために使用することができることを知っているが、ドキュメントは言う:接続が確立される前に、ノンブロッキングI/Oがあるため)
BIO_set_nbio(への呼び出しがなされるべきです接続プロセス中に設定されます。
もう一つの可能な選択肢は、何とかすべての状態を維持しながら、BIOをコピーして再作成することです。
私はあなたが持っている問題を理解していません。接続が確立されたときにノンブロッキングIOが設定されていることは妥当で、確実にそのコードを抽象化してそのコードを処理できます。 –
問題は、接続が確立されたときにIOを非ブロッキングにするために_大きな変更であることです。 – inthemedium