通过https发请求时出现“curle_out_of_memory”错误

2024-02-29 11:18
文章标签 https 请求 错误 memory curle

本文主要是介绍通过https发请求时出现“curle_out_of_memory”错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在使用libcurl封装的HTTPClient,使用https(443端口)发请求时,遇到返回CURLE_OUT_OF_MEMORY,经过验证发现原因如下:

1、在初始化curl时,有且仅有一次,使用接口:CURLcode ret_code = curl_global_init(CURL_GLOBAL_SSL);

2、在程序退出时,有且仅有一次,使用接口:curl_global_cleanup();

3、经过查询curl的源码,在CURLcode global_init(long flags, bool memoryfuncs)中会调用Openssl的初始化:Curl_ssl_init(),在curl_global_cleanup(void)中会调用 Curl_ssl_cleanup();因此只要libcurl没有被cleanup,那么Openssl也不会被清理;

4、curle_out_of_memory实际的含义是:与服务端握手时,没有通过,我发现这个错误是由于调用ssl_library_init()初始化openssl库失败造成的。或者说,在使用openssl时发现openssl库被其他也依赖openssl的应用清理掉了(ssl_context_destroy),就算curl中没有清理,使得curl再一次请求时,又没有机会再一次Init,所以Iopenssl握手不成功,请求无法发出,返回错误。

5、最后验证确实如此,其他的应用逻辑在执行完毕时,将自己依赖的openssl清理掉:

     ......

    ERR_free_strings();
    EVP_cleanup();
    CRYPTO_cleanup_all_ex_data();

6、在一个项目中,如果各个SDK依赖OpenSSL的动态库,那么一定会出现这种情况,一个模块Close后很可能清理掉OpenSSL对其他模块有影响,因此我们会想到,各自依赖OpenSSL的静态库,这样各个模块按理相互独立,无论是初始化还是销毁,都不会干扰,但是在一些平台如安卓,各个模块都使用OpenSSL的静态库,实际不是这样。比如SDK1依赖静态库a,SDK2依赖静态库a,SDK3依赖静态库a,静态库a改变只是针对SDK1而改,那么SDK2和SDK3无需更新a,只需SDK1重新编译即可,但是安卓平台,需要各个全部重新编译。这是我遇到的问题,我也不太明白为何这样?

7、针对这样的问题,我们只能判断使用全局变量控制和判断;

static int  SSL_library_init = 0;

if(SSL_library_init >0) return ;

  SSL_library_init =1;

 

 

 

 

这篇关于通过https发请求时出现“curle_out_of_memory”错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758587

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr