通过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

相关文章

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.

Java编译错误java.lang.NoSuchFieldError的解决方案详析

《Java编译错误java.lang.NoSuchFieldError的解决方案详析》java.lang.NoSuchFieldError是Java中的一种运行时错误,:本文主要介绍Java编译错... 目录前言解决方案1. 统一JDK版本环境2. 优化maven-compiler-plugin配置3. 清

Navicat连接Mysql8.0.11出现1251错误的解决方案

《Navicat连接Mysql8.0.11出现1251错误的解决方案》在重装电脑并安装最新版MySQL后,Navicat和Sqlyog连接MySQL时遇到的1251和2058错误,通过将MySQL用户... 目录Navicat连接mysql8.0.11出现1251错误原因分析解决问题方法有两种总结Navic

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3