2017-08-15 61 views
0

我正在編寫一個服務(用於CentOS的C語言),它必須通過SSL與第三方REST API進行大量出站SSL連接。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

操作系統軟限制,所以這個問題的FD沒有被關閉並釋放回內核?

這是通過

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

證實任何一個可以請以正確的OpenSSL會議關機程序幫助?

回答

2

SSL_shutdown文檔中提到,它只是將關閉通知TLS連接正常關機兩端

實際上它並不關閉套接字,你的應用程序應調用close() FD上明確,以便在插槽正確關閉。 由於您當前的套接字沒有正確關閉,所以FD沒有被重用,並且每個新套接字都會獲得新的FD,因爲您提到的最終會超出限制

相關問題