如何让使用阻塞BIO的OpenSSL服务器干净地关闭

How do I get an OpenSSL server using blocking BIO to shutdown cleanly?

本文关键字:服务器 OpenSSL BIO      更新时间:2023-10-16

在一个较大的服务器应用程序中,我有一个线程与一个基本的OpenSSL服务器在阻塞模式下使用BIO,因为这似乎是最简单的方法。我的代码接受来自手机(Android或iOS,我不是在写代码)的单一类型的请求,并返回一个用基本HTML包装的十六进制字符串(描述我的部分服务器状态)。我选择了SSL和psuedoHTTPS服务器,因为这对手机开发人员来说更容易。如果请求中有服务器不理解的内容,我会返回404。这一切都有效。

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

我尝试过BIO_get_fd()和setsockopt()在底层套接字上设置超时,但它仍然会阻塞。有点令人担忧的是,SSL_state()停留在"before/accept initialization",但在此基础上循环显然不起作用。

我认为其他人有这样的服务器代码,这些服务器可以正常关闭。他们是怎么做到的?另一个线程是否有办法打破该块,并让accept调用返回错误?或者,我必须放弃屏蔽呼叫的想法,转而使用明显糟糕的非屏蔽版本?

当我的服务器关闭时,这个线程不会因为阻止BIO_do_accept调用而退出。

要停止阻塞,请关闭关联的套接字。它将立即返回。

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

不要在信号处理程序中对OpenSSL做任何其他操作,因为它不是异步信号安全的。让主线程在工作线程返回后进行清理。例如,请参见libcrypto线程安全性。