gpt4 book ai didi

c++ - 如何让 OpenSSL 服务器使用阻塞 BIO 干净地关闭?

转载 作者:太空狗 更新时间:2023-10-29 12:17:03 26 4
gpt4 key购买 nike

在一个更大的服务器应用程序中,我有一个线程与一个在阻塞模式下使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com