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
相关产品推荐
相关产品推荐

