複数のブロッキング ソケットを使用するサーバー スレッドがあり、処理するデータがあるときにそれを実行する必要があります。問題は、ブロッキング操作 (アプリケーション データの待機中) に陥ることなく、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 なしで実行してもブロックされていないようですが、必要なことを実行しているかどうかはまだわかりません...