2011-12-07 25 views
6

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をコピーして再作成することです。

+0

私はあなたが持っている問題を理解していません。接続が確立されたときにノンブロッキングIOが設定されていることは妥当で、確実にそのコードを抽象化してそのコードを処理できます。 –

+0

問題は、接続が確立されたときにIOを非ブロッキングにするために_大きな変更であることです。 – inthemedium

答えて

5

私は自分の "lion"コードで非ブロッキングSSL接続を行いましたが、OpenSSLではBIO機能をまったく使用しませんでした。

むしろ、私は自分のfdsetsを処理し、selectを呼び出すための呼び出し SSL_set_fd(ctx, fd)SSL_get_fd(ssl)のために行ってきました。

トラッキングするのに最も時間がかかった「gotcha」は、SSL_MODE_ACCEPT_MOVING_WRITE_BUFFERSSL_MODE_ENABLE_PARTIAL_WRITEを設定していました。

あなたは、コードのSSL部分を読みたい場合は、それはここにある:

https://github.com/lundman/lion/blob/master/src/tls.c

関連する問題