- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在一个更大的服务器应用程序中,我有一个线程与一个在阻塞模式下使用 BIO 的基本 OpenSSL 服务器,因为这似乎是最简单的方法。我的代码接受来自手机(Android 或 iOS,我没有编写该代码)的单一类型的请求,并返回一个包含在基本 HTML 中的十六进制字符串(描述我的服务器状态的一部分)。我选择了 SSL 和伪 HTTPS 服务器,因为这让手机开发人员的工作变得更容易。如果服务器不理解请求中的任何内容,我将返回 404。这一切都有效。
问题:当我的服务器关闭时,由于阻塞 BIO_do_accept 调用,此线程不会退出。
我已尝试使用 BIO_get_fd() 和 setsockopt() 在底层套接字上设置超时,但它仍然阻塞。有点令人担忧的是 SSL_state() 停留在“之前/接受初始化”,但循环显然是行不通的。
我假设其他人有这样的服务器代码,并且这些服务器可以正常关闭。他们是怎么做到的?有没有办法让另一个线程打破那个 block 并让 accept 调用返回一个错误?还是我必须放弃阻止调用的想法并仔细研究 apparently awful non-blocking version ?
最佳答案
When my server shuts down this thread doesn't exit because of the blocking BIO_do_accept call.
要停止阻塞,请关闭关联的套接字。它会立即返回。
从您的信号处理程序执行关闭。
不要在与 OpenSSL 相关的信号处理程序中执行任何其他操作,因为它不是异步信号安全的。一旦您的工作线程返回,让主线程清理。参见,例如,libcrypto
Thread Safety .
关于c++ - 如何让 OpenSSL 服务器使用阻塞 BIO 干净地关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21126691/
我是一名优秀的程序员,十分优秀!