1

OpenSSLを使用してHTTPSサーバーに接続し、データを送信して応答を読み取ります。接続を開いたままにして、データが利用可能になり次第読み取る必要があります。

私はBIOを使用しており、でデータを読み取りますBIO_read

問題は、ソケットを使用して待機しているのにselect()、読み取り可能なDATAがあるかどうかわからないことです。

私は試しました(select()読み取り可能なデータがあることを確認した後):

  • BIO_eof
  • BIO_pending
  • BIO_should_read
  • SSL_pending
  • SSL_peek

しかし、それは機能していないようです。BIO_eoffalseを返し、他の関数でデータをチェックしますが、たとえば、BIO_pending使用可能なデータがある場合でもfalseを返します。

これらの関数に基づいてtrueを返すとSYSCALL_ERROR、何かがおかしいことになります。

ソケットで利用可能な読み取りデータがあるかどうかを確認するにはどうすればよいですか?SSL/BIO_readが呼び出されたときに、これらの関数を使用せずに読み取ることができるデータがあることを確認する必要があります。もちろん、私はそれらを使用できますが、データを失うことはありません。

助言がありますか?

4

1 に答える 1

0

select() を使用してソケットを待機していますが、いつデータを読み取れるかどうかわかりません。

はい、できます。select()> 0 が返され、 が存在し、存在readfdsしない場合writefdsは、読み取り可能なソケットがあります。ただし、読み取られるデータは、アプリケーション データではなく、SSL データである可能性があります。それを前もって言うことはできません。あなたは見つけるために読む必要があります。API でアドバイスされているように、そうした後もデータがない、または書き込む必要があるなどの可能性が残ります。それに対処するだけです。

于 2013-01-21T22:19:44.743 に答える