2017-06-15 151 views
1

當我在BIO_reset函數後調用close(socket_fd)時,程序崩潰。崩潰日誌顯示傳遞給close()函數的無效句柄。BIO_reset在內部調用close(socket_fd)嗎?或者我們有明確關閉套接字文件描述符

void close_ssl_stream(BIO *bio, int socket) 
{ 
    BIO_flush(bio); 
    BIO_reset(bio); 
    BIO_free_all(bio); 
    ERR_clear_error(); 
    ERR_free_strings(); 
    ERR_remove_state(0); 
    printf("Closing socket fd: %d\n", socket); 
    close(socket); 
} 

程序在關閉(插座)線處崩潰。

我已經將BIO_reset函數上方的(套接字)行關閉。

{ 
     BIO_flush(bio); 
     printf("Closing socket fd: %d\n", socket); 
     close(socket); 
     BIO_reset(bio); 
     BIO_free_all(bio); 
     ERR_clear_error(); 
     ERR_free_strings(); 
     ERR_remove_state(0); 
    } 

現在它在BIO_reset(bio)行崩潰。 如何釋放此程序中的套接字文件描述符?任何改進此代碼的建議也受到歡迎。

+1

你後者片段看起來很像第一,有沒有錯誤呢?而且,(系統調用)'close()'不應該崩潰,不管你傳遞了什麼,它可能會返回'EBADFD'。 – ilkkachu

+0

@ilkkachu。是啊。我現在糾正了它。 – smartkid

回答

1

不,BIO_Reset()不關閉底層文件描述符。如果你之後所做的是釋放/關閉BIO,則不需要在顯示的代碼中調用BIO_Reset。

如果您在BIO上設置了BIO_CLOSE標誌,BIO_free()/ BIO_free_all()將關閉底層文件描述符。否則,你必須自己關閉()文件描述符。

(請注意,您ERR_clear_error和其他電話ERR_全球運營,除非你永遠不打算再次使用SSL庫,您不應該執行這些調用)

相關問題