当我在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(生物)线崩溃了。 如何在这个程序中释放套接字文件描述符?任何改进此代码的建议也受到欢迎。
答案 0 :(得分:1)
不,BIO_Reset()不会关闭基础文件描述符。如果之后所做的只是释放/关闭BIO,则无需在显示的代码中调用BIO_Reset。
如果您在BIO上设置了BIO_CLOSE标志,则BIO_free()/ BIO_free_all()将关闭基础文件描述符。否则你必须自己关闭()文件描述符。
(请注意,您的ERR_clear_error和其他ERR_调用全局运行,除非您再也不打算再使用SSL库,否则不应执行这些调用)