2

SSL 接続をバッ​​ファリングしている BIO オブジェクトがあります。接続をポーリングして、ブロックせずに読み取りを呼び出せるかどうかを確認するにはどうすればよいですか?

OpenSSL Web サイトには次のように記載されています。

ソケットをブロックする際に使用されるテクニックの 1 つは、システム コール (select()、poll() など) を使用してデータが利用可能になるタイミングを判断し、read() を呼び出してデータを読み取ることです。BIO と同等のもの (基礎となる I/O 構造体で select() を呼び出し、次に BIO_read() を呼び出してデータを読み取る) は使用しないでください。 SSL BIO の場合) は、基礎となる I/O 構造に影響を与え、結果としてブロックされる可能性があります。代わりに、select() (または同等のもの) を非ブロック I/O と組み合わせて、連続する読み取りがブロックではなく再試行を要求するようにする必要があります。

ここでの問題は、他の場所で行われた接続のタイプを変更できないことです。私の目標を達成する別の方法はありますか?

4

1 に答える 1

0

おそらく、fcntl(2)'sを使用して、ファイル記述子にフラグF_SETFLを設定できます。O_NONBLOCKこのフラグを設定するときまでにソケットはOpenSSLのBIOユーティリティを介して使用されているため、問題はありません。アプリケーションの残りの部分は、BIOルーチンを通過するまでソケットからのデータを利用できません。

したがって、接続タイプを変更できると思います。

bio.hヘッダーに、あなたのケースに合わせて作成されたように見えるAPIが表示されます。

#define BIO_set_nbio(b,n)       BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL)

ただし、マニュアルには次の注意事項があります。

   BIO_set_nbio() sets the non blocking I/O flag to n. If n is
   zero then blocking I/O is set. If n is 1 then non blocking
   I/O is set. Blocking I/O is the default. The call to
   BIO_set_nbio() should be made before the connection is
   established because non blocking I/O is set during the
   connect process.

おそらく、接続が確立されると、基盤となるBIOインターフェイスは変更されることを期待していません。自分で明示的に呼び出すことでこれ試す価値がありfcntl(2)ます-おそらくそれはすべてJustWorkです。

于 2012-06-09T23:48:27.223 に答える