0

複数のブロッキング ソケットを使用するサーバー スレッドがあり、処理するデータがあるときにそれを実行する必要があります。問題は、ブロッキング操作 (アプリケーション データの待機中) に陥ることなく、OpenSSL に「そのようなこと」(再ネゴシエーションなど) を行わせるにはどうすればよいかということです。注:私はSSL_set_mode - SSL_MODE_AUTO_RETRYそうする必要はなく、自分でケースを処理する必要があると思いますが、ドキュメントを読んでも、それをどのように達成するかは明らかではありません. 次の擬似コードを検討してください。

while(running){
    select on readability sockets 1 and 2
    if(socket 1 readable) {
        SSL_read data(socket 1)
        process data, possibly interacting with socket 2
    }
    if(socket 2 readable) {
        SSL_read data(socket 2)
        process data, possibly interacting with socket 1
    }
}

いずれかのソケットに SSL/TLS 層の「やるべきこと」があるが、アプリケーション層のデータがないために選択がドロップアウトした場合はどうなりますか? SSL_read「やるべきこと」を処理しますが、アプリケーションデータがないためブロックします...そのブロックは、他のソケットから読み取る機能を殺します。アプリケーションデータについて教えてくれるこの素晴らしいメソッドがありますが、私が知る限りSSL_pending、スタックはデータなしではデータを取得する機会がありません。SSL_readソケットを個別のスレッドに分割するか、非ブロック ソケットを使用する以外に、OpenSSL レイヤーに「必要に応じて再ネゴシエーションを実行し、データ レコードがある場合は読み取るが、ブロックしない場合はブロックしない」などの簡単な方法はありますか?どちらも必要ありません」? NULL/NULL 読み取りまたは書き込みのようなものですか?

// process records on the socket
SSL_read( ssl, 0, 0 ); // or maybe SSL_write( ssl, 0, 0 ) ?
if ( SSL_pending( ssl ) ) {
    // do the application data read
    SSL_read( ssl, buf, sizeof(buf) );
}

編集: select-readなしで試してみましたSSL_read( ssl, 0, 0 )が、レコードをブロックするため、機能しません。select を実行してから read-0/0 を実行するかSSL_write( ssl, 0, 0 )、select なしで実行してもブロックされていないようですが、必要なことを実行しているかどうかはまだわかりません...

4

1 に答える 1

0

SSL_Pending は、使用している目的ではなく、先読み用です。ブロック読み取りは、次の読み取りが行われるたびに自動的に再ネゴシエートします。ssl_set_fd を使用している場合は、記述子に受信タイムアウトを設定できます。この場合に役立つ可能性があります。 複数の接続を行うときにCでソケットタイムアウトを設定するには?

それ以外の場合は、非ブロッキング io を使用できます。

于 2013-08-16T15:56:01.687 に答える