如何使用阻止BIO干净地关闭OpenSSL服务器?

时间:2014-01-15 00:07:44

标签: c++ linux ssl openssl

在一个更大的服务器应用程序中,我有一个线程,其中一个基本的OpenSSL服务器在阻塞模式下使用BIO,因为这似乎是最简单的方法。我的代码接受来自手机(Android或iOS,我不编写该代码)的单一类型的请求,并返回包含在基本HTML中的十六进制字符串(描述我的服务器状态的一部分)。我已经使用了SSL和伪造的HTTPS服务器,因为这样可以让手机开发人员更轻松。如果请求中存在服务器无法理解的任何内容,则返回404.这一切都有效。

问题:当我的服务器关闭时,由于阻止BIO_do_accept调用,此线程不会退出。

我已尝试使用BIO_get_fd()和setsockopt()在底层套接字上设置超时但它仍会阻塞。有点令人担忧的是SSL_state()停留在“在/接受初始化之前”,但循环显然不起作用。

我假设其他人都有这样的服务器代码,这些服务器可以优雅地关闭。他们是怎么做到的?有没有办法让另一个线程打破该块并让接受调用返回错误?或者我是否必须放弃阻止呼叫并通过apparently awful non-blocking version

进行研磨的想法

1 个答案:

答案 0 :(得分:2)

  

当我的服务器关闭时,由于阻止BIO_do_accept调用,此线程不会退出。

要停止阻止,请关闭相关的套接字。它会立即返回。

从信号处理程序执行关机。

对于OpenSSL,请勿在信号处理程序中执行任何其他操作,因为它不是异步信号安全的。一旦您的工作线程返回,就让主线程清理。例如,请参阅libcrypto Thread Safety