2012-10-31 14 views
5

OpenSSL APIを使用して1つのSSLクライアントを作成し、1つのSSLサーバーと対話しています。 OpenSSLサイトでは、データの書き込み後に書き込みバッファをフラッシュする必要があることを知りました。クライアントプログラムでSSL_WriteとSSL_Readを使用しています。 OpenSSLサイトでBIO_flush(BIO *)を使用してデータをフラッシュしようとすると、ここでクラッシュしています。SSL書き込みバッファをフラッシュする方法はありません

私が使用していますSSLライブラリがに任意の他の方法があり は、だから私はちょうど知りたいと思った:-(..私はBIO_flushはバッファを書き込み読み出しバッファを点滅させたりするかどうかについては明らかではないよ。ここ

this siteからもらいましたここで

は私のクライアントプログラムの詳細にありますか?... SSLの書き込みバッファをフラッシュする。SSL_new
  • クレアを使用してSSLオブジェクト(MSSL)の作成

    1. ティンTCPソケットとサーバ
    2. SSL_set_bio(MSSL、mBio、mBio)を使用して、SSLオブジェクトにBIOオブジェクトを設定するBIO_new_socket(socket_id、BIO_NOCLOSE)
    3. を使用してBIOオブジェクト(mBio)の作成と接続します。
    4. SSL_set_fd(mSsl、socket_id);を使用してソケットをSSLオブジェクトに設定する。
    5. SSL_Connect(mSsl)を使用してサーバーとSSL接続します。

    上記の手順の後、私は書き込みと読み取りのための2つの別々のスレッドを開始しています。書き込みスレッドはSSL_writeを使用してサーバーにデータを書き込み、読み取りスレッドはSSL_Readを使用してサーバーからデータを読み取ります。

    SSL_Writeを使用して各パケットを書き込んだ後の書き込みスレッドで、私はBIO_flush(mBio)を呼び出しています。

    プログラム全体で、私はバイオバッファをフラッシュするためにこの場所でのみmBioオブジェクトを直接使用しています。

    いくつかのパケットの送信を開始すると、BIO_flushでプログラムがクラッシュします...ダンプごとに、BIO_ctrl関数でそのことが示されます。私はそれ以上何も得ていない。

    私は上記のリンクを提供し、同じ問題に直面しているライブラリを使用しましたか?はいの場合は、解決策をご存知の場合はお知らせください。

    BIO_flush()を使用するスレッド同期ルールはありますか?私はBIO_flushへの呼び出しを意味しますSSL_Readは同じように発生しません...?

  • 答えて

    2

    BIO_flushは、書き込みデータをフラッシュするために使用されます。

    BIO構造体がSSL_read/write呼び出しを認識していないため、BIO_flushとSSL_read/writeの組み合わせが問題になります。

    BIO_read/writeを使用すると、より良い結果が得られます。

    SSL_read/writeを絶対に使用する必要がある場合は、BIOを使用しないでください。

    このOpenSSLドキュメントの最後の例では、はるか遠くにあると思います。

    Simple OpenSSL Client Example

    その例をしようとしたとき、あなたはまだクラッシュを取得している場合は、あなたが使用しているビルドする特定のライブラリに問題があるかもしれません。

    6

    書込みバッファが書込み後にフラッシュされる必要があることを、あなたはどこで知りましたか?

    私もフラッシュ機能を探していましたが、見つからなかった。

    SSL_writeを呼び出すたびに、少なくとも1つのSSLレコードが生成され、ソケットに送信されます。ソケットでは、nagleアルゴリズムがカーネル内でそれを一時的にバッファしてすぐに外部に送信する可能性があります。

    SSL_writeにバッファリングがないため、フラッシュされません!

    私はむしろフラッシュ関数を持っていて、すべてのSSLレコードを括弧で埋めるのですが、それは私が見るところでは利用できません。私は自分でバッファリングを行い、可能な限りSSL_writeを大量に呼び出す予定です。

    私はちょっとしたテストプログラムを書いています:1回の書き込みでバッファを送信してから、再度実行して、各文字に対してSSL_writeを呼び出しました。私はtcpdumpを実行してWiresharkを実行すると、最初の実行には大規模なアプリケーションデータレコードがなく、2回目の実行には小さなレコードがたくさんあることがわかりました。だから私はそれが確認されたと思います。

    関連する問題