BIO_reset是否在内部调用close(socket_fd)?或者我们是否明确关闭套接字文件描述符

时间:2017-06-15 10:57:55

标签: c sockets openssl

当我在BIO_reset函数之后调用close(socket_fd)时,我的程序崩溃了。崩溃日志显示传递给close()函数的无效句柄。

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函数上的close(socket)行移动了。

 {
        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(生物)线崩溃了。 如何在这个程序中释放套接字文件描述符?任何改进此代码的建议也受到欢迎。

1 个答案:

答案 0 :(得分:1)

不,BIO_Reset()不会关闭基础文件描述符。如果之后所做的只是释放/关闭BIO,则无需在显示的代码中调用BIO_Reset。

如果您在BIO上设置了BIO_CLOSE标志,则

BIO_free()/ BIO_free_all()将关闭基础文件描述符。否则你必须自己关闭()文件描述符。

(请注意,您的ERR_clear_error和其他ERR_调用全局运行,除非您再也不打算再使用SSL库,否则不应执行这些调用)

相关问题