如何让使用阻塞BIO的OpenSSL服务器干净地关闭
How do I get an OpenSSL server using blocking BIO to shutdown cleanly?
在一个较大的服务器应用程序中,我有一个线程与一个基本的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
线程安全性。
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 如何在openssl-ecc中获取十六进制格式的私钥
- OpenSSL TLS服务器-使用客户端证书白名单
- 无法使用 openssl 服务器,因为密码已过时...什么的...ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- 无法使用 OpenSSL 1.1.1 从 ClientHello 检索服务器名称 (SNI)
- iocp openssl 对等服务器在与 ConnectEx 连接后关闭连接
- 带有openSSL的libwebsocket服务器不接受连接
- 证书验证在客户端服务器通信中使用boost :: asio和openssl失败
- 如何让使用阻塞BIO的OpenSSL服务器干净地关闭
- 无法使用OpenSSL验证服务器证书
- WebRTC DTLS-SRTP OpenSSL服务器握手失败
- 如何在 OpenSSL 中使用 SSL 证书与 gsoap,使用 C++ 客户端/服务器
- 服务器在 Openssl 初始化时失败
- C++Openssl中的服务器密钥交换
- OpenSSL:服务器无法验证客户端证书
- Windows上的TLS客户机和服务器[openssl vs. sspi vs. cryptlib]
- 连接QSslSocket与OpenSSL服务器
- 在C/C++中与Openssl epoll服务器同时与多个客户端进行通信
- 使用OPENSSL(使用证书)进行客户端-服务器通信
- 密码套件错误或与OpenSSL服务器没有连接