2017-08-15 15 views
0

SSLを介してサードパーティのREST APIに多くの送信SSL接続を行わなければならないサービス(CentOSのC言語)を作成しています。OpenSSLはファイルハンドルを解放しません

OpenSSLは、リモートサーバーとの安全な接続の確立を作成するために使用されます。 ssl_connectionの初期化後、返されたファイルディスクリプタをepollキューに登録します。

私はAPIトランザクションに接続して実行することができます。その後、リモートサーバーは接続を終了し、fdでEPOLLRDHUPを取得し、クリーンアップルーチンを呼び出します。

signal(SIGPIPE,SIG_IGN); 

    if(PS(endpoint)->ssl != NULL) 
    { 
     if(SSL_shutdown(PS(endpoint)->ssl)==0) 
     { 
      SSL_shutdown(PS(endpoint)->ssl); 
     } 
    } 

    if(PS(endpoint)->web != NULL) 
    { 
     BIO_free(PS(endpoint)->web); // This can cause a SIGPIPE, especialy when debugging! 
     PS(endpoint)->web = NULL; 
    } 

このシャットダウン手順で問題はないようですが、エラーはスローされません。

は、しかし - すべての後続の接続は、次のシステムFDを取り、eventualyすべてのファイル記述子が1028

のOSソフト制限に達し排出されるので問題はFDを閉じて戻ってカーネルに解放されないのですか?

これは、いずれかが正しいOpenSSLのセッションのシャットダウン手順を助けてください

ls /proc/$PID/fd/ | wc -l 

を通じて確認されていますか?

答えて

2

SSL_shutdownドキュメントが言及し、それはちょうどそれが実際にソケットを閉じません

を両端にTLS接続の適切なシャットダウンのためのクローズ通知を送信し、ソケットが正常に閉じられているように、あなたのアプリケーションは、明示的にFDにclose()を呼び出す必要があります。 現在のソケットが正しく閉じられていないため、FDが再利用されることはなく、新しいFDを取得するたびに新しいFDが得られます。

関連する問題