You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSL_shutdown手册描述与程序实际行为不符的问题咨询

非阻塞SSL_shutdown返回0后出现SSL_ERROR_SYSCALL的问题

我在编写SSL关闭处理函数时遇到了异常情况,以下是相关代码和问题详情:

非阻塞模式服务器端代码片段

int r = SSL_shutdown(ssl);
if (r == 1)
{
   return Success;
}

// 根据手册说明,返回0表示关闭过程"正在进行中"
if (r == 0)
{
   switch ((r = SSL_get_error(ssl, r)))
   {
      case SSL_ERROR_WANT_READ:
         std::cout << "shutdown want read" << std::endl;
         ...
         return ...;

      case SSL_ERROR_WANT_WRITE:
         std::cout << "shutdown want write" << std::endl;
         ...
         return ...;

      default:
         std::cout << r << " " << strerror(errno) << std::endl;
         ...
         return ...;
   }
}

阻塞模式客户端代码片段

根据手册要求,客户端需要调用两次SSL_shutdown:

if (SSL_shutdown(ssl) == 0)
{
   if (SSL_shutdown(ssl) != 1)
   {
      report_error_and_exit("SSL_shutdown");
   }
}

手册描述与实际异常

根据SSL_shutdown的官方文档:

如果底层BIO是非阻塞的,且关闭过程尚未完成(例如未收到对等方的close_notify告警,或需要发送close_notify但当前会阻塞),SSL_shutdown()会返回0表示关闭仍在进行中;此时调用SSL_get_error()应该返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE。

但实际运行时,服务器端SSL_shutdown返回0后,调用SSL_get_error得到的是5(SSL_ERROR_SYSCALL),此时检查errno,strerror(errno)返回"Success",这与预期不符,求解答。

内容的提问来源于stack exchange,提问作者user180574

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:32:58