SSL_read()返回0且SSL_get_error()返回6,读取时连接关闭原因是什么?
问题原因说明
SSL_ERROR_ZERO_RETURN就是你读取返回0字节的直接原因,这个状态表示对端已经正常发送了TLS关闭通知(close_notify),TLS连接已经正常终止,没有更多数据可以读取。
你遇到这个问题的核心原因是:TLS握手完成后你没有向HTTPS服务器发送任何HTTP请求,服务器等待客户端请求超时后,主动关闭了连接,因此你调用SSL_read直接拿到了连接关闭的通知。
代码问题&修复步骤
1. 修复现有代码错误
- 宏名不匹配:你定义的错误检查宏是
CHECK_ERR,但创建socket时用了CHK_ERR,会导致编译报错 - 变量重复定义:函数入参已经声明了
uint8_t *str,函数内部又重复定义char* str - 格式化字符串错误:打印接收字节数的
printf里写的是% bytes,应该改为%d bytes
2. 新增HTTP请求发送逻辑
TLS握手成功后,需要先构造合法的HTTP请求,用SSL_write发送给服务器,再读取响应,示例代码如下:
// SSL_connect 成功之后添加以下代码 const char *http_req = "GET /你要下载的文件路径 HTTP/1.1\r\n" "Host: 你的服务器IP或域名\r\n" "Connection: close\r\n" "\r\n"; int send_len = SSL_write(ssl, http_req, strlen(http_req)); CHECK_SSL(send_len); // 之后再调用SSL_read读取响应 err = SSL_read (ssl, buf, sizeof(buf) - 1);
3. 可选补充配置
如果你的HTTPS服务器是多站点托管,用域名访问的话,需要在SSL_connect前添加SNI扩展配置,否则服务器可能会拒绝请求:
SSL_set_tlsext_host_name(ssl, "你的服务器域名");
内容的提问来源于stack exchange,提问作者xyf
相关产品推荐
相关产品推荐

