1

我需要让用户能够在 SSL 和非 SSL 通信之间切换。为此,SSL 代码查找特定的命令包,关闭 SSL 内容并开始正常的 TCP/IP 通信。这工作正常。但是,当我尝试重新启动一切以在 SSL 模式下运行时,我从 SSL_accept 收到 -2 错误。一定有什么东西我没有清理,但是经过大量搜索清理建议后我没有找到它,所有这些我都扔了,如下所示:

    SSL_shutdown(ssl);
    SSL_CTX_free(ctx);
BIO_free(acc);
CONF_modules_unload(1);
OBJ_cleanup();
EVP_cleanup();
ENGINE_cleanup();
CRYPTO_cleanup_all_ex_data();
ERR_remove_state(0);
ERR_free_strings(); 

很难相信在那之后还有什么需要清理的!

4

1 回答 1

0

您应该发布更多代码以确切了解您是如何收到错误的。如果你做一个SSL_get_error失败的 SSL_accept,你到底收到了什么?

从这些建议中,我可以看到你正在做一个BIO_free,有时依赖它可能会关闭连接的底层BIO_METHOD,我假设你正在为下一个 SSL_accept 重用它,这可能是问题所在:

调用 BIO_free() 也可能对底层 I/O 结构产生一些影响,例如它可能会在某些情况下关闭被引用的文件。有关更多详细信息,请参阅各个 BIO_METHOD 描述。

来自 BIO_free man

如果你想重用连接,你应该BIO_pop 在这里检查。

于 2013-03-05T10:20:44.180 回答