在一个更大的服务器应用程序中,我有一个线程,其中一个基本的OpenSSL服务器在阻塞模式下使用BIO,因为这似乎是最简单的方法。我的代码接受来自手机(Android或iOS,我不编写该代码)的单一类型的请求,并返回包含在基本HTML中的十六进制字符串(描述我的服务器状态的一部分)。我已经使用了SSL和伪造的HTTPS服务器,因为这样可以让手机开发人员更轻松。如果请求中存在服务器无法理解的任何内容,则返回404.这一切都有效。
问题:当我的服务器关闭时,由于阻止BIO_do_accept调用,此线程不会退出。
我已尝试使用BIO_get_fd()和setsockopt()在底层套接字上设置超时但它仍会阻塞。有点令人担忧的是SSL_state()停留在“在/接受初始化之前”,但循环显然不起作用。
我假设其他人都有这样的服务器代码,这些服务器可以优雅地关闭。他们是怎么做到的?有没有办法让另一个线程打破该块并让接受调用返回错误?或者我是否必须放弃阻止呼叫并通过apparently awful non-blocking version?
进行研磨的想法答案 0 :(得分:2)
当我的服务器关闭时,由于阻止BIO_do_accept调用,此线程不会退出。
要停止阻止,请关闭相关的套接字。它会立即返回。
从信号处理程序执行关机。
对于OpenSSL,请勿在信号处理程序中执行任何其他操作,因为它不是异步信号安全的。一旦您的工作线程返回,就让主线程清理。例如,请参阅libcrypto
Thread Safety。