openssl之BIO系列之8---读写出错控制

openssl之BIO系列之6---BIO的IO操作函数 BIO的IO操作函数    ---根据openssl doc/crypto/bio/bio_read.pod翻译和自己的理解写成        (作者:DragonKing Mail:wzhah@263.net 发布于:http://gdwzh.126.com之openssl专业论坛)        这些函数是BIO的基本读写操作函数,包括四个,他们的定义如下(openssl/bio.h):    阅读详情
 当BIO_read或BIO_write函数调用出错的时候,BIO本身提供了一组出错原因的诊断函数,他们定义如下(openssl/bio.h):
     #define BIO_should_read(a) ((a)->flags & BIO_FLAGS_READ)
     #define BIO_should_write(a) ((a)->flags & BIO_FLAGS_WRITE)
     #define BIO_should_io_special(a) ((a)->flags & BIO_FLAGS_IO_SPECIAL)
     #define BIO_retry_type(a) ((a)->flags & BIO_FLAGS_RWS)
     #define BIO_should_retry(a) ((a)->flags & BIO_FLAGS_SHOULD_RETRY)
    
     #define BIO_FLAGS_READ 0x01
     #define BIO_FLAGS_WRITE 0x02
     #define BIO_FLAGS_IO_SPECIAL 0x04
     #define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL)
     #define BIO_FLAGS_SHOULD_RETRY 0x08
    
     BIO * BIO_get_retry_BIO(BIO *bio, int *reason);
     int BIO_get_retry_reason(BIO *bio);
    因为这些函数是用于决定为什么BIO在读写数据的时候不能读出或写入数据,所以他们一般也是在执行BIO_read或BIO_write操作之后被调用的。
    【BIO_should_retry 】
    如果读写出错的情况是要求程序稍后重试,那么该函数返回true.如果该函数返回false,这时候判定错误情况就要根据BIO的类型和BIO操作的返回值来确定了。比如,如果对socket类型的BIO调用BIO_read操作并且返回值为0,此时BIO_should_retry返回false就说明socket连接已经关闭了。而如果是file类型的BIO出现这样的情况,那说明就是读到文件eof了。有些类型BIO还会提供更多的出错信息,具体情况参见各自的说明。
    如果BIO下层I/O结构是阻塞模式的,那么几乎所有(SSL类型BIO例外)BIO类型都不会返回重试的情况(就是说调用BIO_should_retry不会返回true),因为这时候对下层I/O的调用根本不会进行。所以建议如果你的应用程序能够判定该类型BIO在执行IO操作后不会出现重试的情况时,就不要调用BIO_should_retry函数。file类型BIO就是这样的一个典型例子。
    SSL类型的BIO是上述规则的唯一例外,也就是说,既便在阻塞型的I/O结构中,如果在调用BIO_read的时候发生了握手的过程,它也能会返回重试要求(调用BIO_should_retry返回true)。在这种情况下,应用程序可以立刻重新执行失败的I/O操作,或者在底层的I/O结构中设置为SSL_MODE_AUTO_RETRY,那么就可以避免出现这种失败的情况。
    如果应用程序在非阻塞型BIO中调用IO操作失败后立刻重试,那么可能导致效率很低,因为在数据允许读取或有效之前,调用会重复返回失败结果。所以,正常的应用应该是等到需要的条件满足之后,程序才执行相关的调用,至于具体怎么做,就跟底层的IO结构有关了。例如,如果一个底层IO是一个soket,并且BIO_should_retry返回true,那么可以调用select()来等待数据有效之后再重试IO操作。在一个线程中,可以使用一个select()来处理多个非阻塞型的BIO,不过,这时候执行效率可能出现非常低的情况,比如如果其中一个延时很长的SSL类型BIO在握手的时候就会导致这种情况。
    在阻塞型的IO结构中,对数据的读取操作可能会导致无限期的阻塞,其情况跟系统的IO结构函数有关。我们当然不期望出现这种情况,解决的办法之一是尽量使用非阻塞型的IO结构和使用select函数(或equivalent)来设置等待时间。
    【BIO_should_read】
    该函数返回true如果导致IO操作失败的原因是BIO此时要读数据。
    【BIO_should_write】
    该函数返回true如果导致IO操作失败的原因是BIO此时要写数据。
    【BIO_should_io_special】
    该函数返回true如果导致IO操作失败的原因是特殊的(也就是读写之外的原因)
    【BIO_get_retry_reason】
    返回失败的原因,其代码包括BIO_FLAGS_READ, BIO_FLAGS_WRITE和BIO_FLAGS_IO_SPECIAL。目前的BIO类型只返回其中之一。如果输入的BIO是产生特殊出错情况的BIO,那么该函数返回错误的原因代码,就跟BIO_get_retry_BIO()返回的reason一样。
    【BIO_get_retry_BIO】

    该函数给出特殊情况错误的简短原因,它返回出错的BIO,如果reason不是设置为NULL,它会包含错误代码,错误码的含义以及下一步应该采取的处理措施应该根据发生这种情况下各种BIO的类型而定。


FW http://blog.youkuaiyun.com/gdwzh/article/details/19204

OpenSSL_BIO接口整理以及Base64编码代码 阅读详情

相关推荐

openssl之BIO系列之9---BIO对的创建和应用

BIO对的创建和应用    ---根据openssl doc/crypto/bio/bio_new_bio_pair.pod翻译和自己的理解写成        (作者:DragonKing Mail:wzhah@263.net 发布于:http://gdwzh.126.com之openssl专业论坛)        BIO对是BIO中专门创建的一对缓存BIO,要创建BIO对,调用下面定义的函数(o

内网安全与OpenSSL专栏 2442

openssl - BIO相关函数

OpenSSL使用BIO的概念,它是一种输入/输出抽象,允许我们以类似的方式使用来自文件,内存或网络的数据。 BIO_read(), BIO_write(), SSL_read(), SSL_write()函数和你使用的BIO对象说明。 SSL_read()read unencrypted data which is stored in the input BIO. SSL_write()write unencrypted data into the output BIO. BIO_write(..

danielzhou1025的博客 1194

Ubuntu下用OpenSSL生成带IP SAN的自签名SSL证书

自签名SSL证书是开发与测试环境中启用HTTPS的基础技术手段,其核心原理是利用OpenSSL工具链离线生成X.509格式的证书与私钥,并通过Subject Alternative Name(SAN)扩展支持IP地址和域名的双重校验。该技术规避了CA信任链依赖,显著降低本地HTTPS部署门槛,具备零网络依赖、5分钟快速交付、Nginx原生兼容等工程优势。典型应用场景包括Docker容器HTTPS封装、Vue/React本地开发服务器反向代理、Python/Java客户端内网API调用,以及Kubernete

weixin_30785593的博客 331

OpenSSL BIO

BIO 本质是一个多态的 I/O 抽象层。通过BIO_METHOD来封装各种数据源,BIO 结构体维护状态和数据链表。BUF_MEM。

loca1h0st 1434

VC++环境OpenSSL简单编程入门

OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。 SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。 下载 Win32OpenSSL-1_0_1.exe 安装; 开始安装; 完成;似乎是提示要支付10美元; 在VC6添加如下目录;从 工具-选项 菜单调出选项对话框; 库目录; 然后来编写一个大数乘法的程序看一下; 大数相乘(Multiplic

bcbobo21cn的专栏 630

ORACLE 12C RAC 启动报错,错误代码 ORA-27300,ORA-27301,ORA-27302

非一体机,12.2 无任何补丁,2套X86服务器,1节点集群异常(数据库正常,还有会话),2节点正常工作,负载不高,硬件、空间均未检查到异常,多路径存在掉线的情况,但通过Mulitpath -ll 看又是正常的,2根私有网络,其中一根不同,sysctl中配置的稀疏模式。5、再次加成crs alert ohas等集群日志,以及根据现象和错误再次到后台sr中查找可用信息,发现有一个类似问题,12.2 RAC 无任何补丁,报同样错误,解决方案为重启两套服务器。查询MOS文档以及后台文档,排除上面指出的问题。

weixin_42344665的博客 1464

openssl之BIO系列之13---Socket类型BIO

Socket类型的BIO也是一种source/sink型BIO,封装了Socket的IO操作,它相关的一些函数定义如下(openssl/bio.h):      BIO_METHOD * BIO_s_socket(void);      #define BIO_set_fd(b,fd,c) BIO_int_ctrl(b,BIO_C_SET_FD,c,fd)      #define BIO_

fryingpan的专栏 987

告别米级误差:手把手教你用Nordic nRF52840实现厘米级蓝牙测距(Channel Sounding实战)

本文详细介绍了如何利用Nordic nRF52840开发板和蓝牙信道探测(Channel Sounding)技术实现厘米级高精度测距。通过硬件配置、软件优化和实战案例,帮助开发者快速掌握低功耗蓝牙测距技术,适用于工业自动化、智能仓储等场景。

weixin_42741930的博客 476

从限速牌上的80.0看数据清洗:用Python识别OSM字段异常

在数据处理中,字段精度问题常因“数值相同但格式不同”的脏数据而引发统计偏差与异常识别困难。以高速公路限速牌上的“80.0 mph”为例,这并非真实速度,而是里程标记混入限速字段的典型数据误用。借助Python与OpenStreetMap的maxspeed标签,通过Overpass API抓取道路数据,在字符串阶段解析小数点,即可批量识别此类异常,并利用可视化分析其分布规律。这套方法适用于配置管理、日志解析、金融金额校验等场景,帮助数据工程师快速定位“看起来一样”的潜在故障源。最终,一个完整的实战项目将展示如

weixin_34059951的博客 211

一文解读DeepSeek训练数据集

本文重点以DeepSeek为例,详细介绍预训练数据集相关内容。大语言模型LLM(如DeepSeek、ChatGPT、文心一言等)的“智慧”源于它们学习的海量数据集。简单来说,数据集就是模型的“知识库”,通常由互联网公开的文本、图片、视频等。这些数据需满足两个特点:规模大和多样性。规模大是指数据量可达千亿级词汇,让模型学习复杂规律;多样性则涵盖多领域(如科技、文学)、多语言、多形式(对话、新闻),帮助模型适应不同场景。例如,训练数据中既有百科知识,也有日常对话,模型才能既解答专业问题,又能闲聊。

u013891230的博客 7087

OpenCV图像拼接实战:用SIFT+透视变换打造无缝全景图(附完整代码)

本文详细介绍了使用OpenCV和SIFT算法实现图像拼接的全过程,包括特征匹配、透视变换和高级融合技术。通过实战代码演示,帮助开发者掌握无缝全景图生成的核心技术,适用于旅行摄影、无人机航拍等多种场景。

eee77的博客 997

openssl框架闲谈--BIO接口

在 OpenSSL中一共有两种类型的BIO,一种是源/目的类型的,另一种是过滤类型的,其实可以统一到一种类型,那就是统一都是过滤类型,这种说法的前提 是一个古老的概念,早在unix时代,人们通常将程序看做一个过滤器,简单的给它一个输入就会得到一个输出,具体会得到什么输出就看程序员的意图了,那个 时候,程序没有现在如此庞大,也没有如此之多的智能和行为逻辑,就是简单的过滤功能,unix提出的一切皆文件...

totoxian 186

Xilinx HydraMini试玩教程

HydraMini是Xilinx推出的基于Pynq-Z2开发板的自动驾驶开发小车,其有着简单易学、高灵活性、高扩展性、高性能等优良特性,是研究人员和学生进入自动驾驶领域的一个平台。本教程会通过最基础的讲解和步骤带领读者熟悉这个平台的基本开发流程。

qq_25762163的博客 1773

iOS/macOS开发实战:OpenSSL编译集成与安全通信指南

在移动应用开发中,数据安全是核心需求,涉及网络通信加密、数据存储保护与用户身份认证等多个层面。其基本原理是通过密码学算法对传输和存储的数据进行加密,确保机密性与完整性。SSL/TLS协议是实现这一目标的关键技术,它通过在传输层之上建立安全通道,为应用层数据提供端到端的保护。OpenSSL作为一个功能全面、跨平台的开源密码学库,提供了SSL/TLS协议的完整实现以及丰富的加密算法工具集,其技术价值在于为开发者提供了底层、灵活且高度可控的安全编程接口。这使得它在需要与异构服务端保持加密通信一致性、支持特定行业算

chuiqi9947的博客 374

基于verilog的16QAM调制

思路1:正交调幅法——实现16QAM调制,可以理解为时相位相差90度的两个正弦波的4PAM叠加。 4比特输入经过2->4进制转化得到两路2比特输入,然后分别经过4PAM后叠加所得输出即为16QAM调制结果。 具体程序稍后编写。 思路2:复合相移法——可以借助前面编写的QPSK,相当于两路幅度不同的QPSK的叠加,比如幅度分别取1和3 。 思路1正交调幅法的设计方案: 两正弦波相位差...

weixin_30725467的博客 2929

STM32铅酸蓄电池内阻测试仪的交流阻抗测量与数据采集优化

本文深入探讨了基于STM32的铅酸蓄电池内阻测试仪设计,重点解析了交流阻抗测量原理与数据采集优化方案。通过采用1kHz交流小信号注入和数字相敏检波技术,实现对电池欧姆内阻的无损精准测量,并详细介绍了硬件前端调理、ADC过采样及系统标定等关键优化手段,有效提升了测量精度与稳定性。

weixin_29168393的博客 487

深入OpenSSL API:从密码学原理到安全通信实战开发指南

安全通信是现代软件开发的基石,其核心依赖于密码学原理与协议实现。密码学通过算法(如AES、RSA)和协议(如TLS)为数据提供机密性、完整性和身份认证。OpenSSL作为广泛使用的开源密码学工具库,将这些理论转化为可调用的API,其价值在于为开发者提供了构建安全通信系统的底层能力。在实际工程中,无论是实现HTTPS服务器、微服务间的双向TLS认证,还是在嵌入式设备上部署DTLS协议,深入理解OpenSSL API都至关重要。本文聚焦于**SSL/TLS协议**的实现细节与**内存管理**的最佳实践,通过剖析

weixin_34375251的博客 333

利用NLP技术分析爬取的文本数据:Python爬虫与自然语言处理实战

网页爬虫(Web Crawler)是一种自动化脚本,通过模拟人类浏览网页的方式,定期抓取网页内容并进行分析和存储。对于大规模的数据抓取任务,爬虫技术提供了极大的便利。常见的Python爬虫库有requestsSelenium等。在本篇博客中,我们从爬取网页文本数据开始,通过清洗和预处理,最终利用自然语言处理技术(包括情感分析、文本分类等)对数据进行了深度分析。通过该过程,我们展示了如何使用Python爬虫抓取文本数据,并利用NLP技术进行分析和建模。

2201_76125261的博客 627

OpenSSL API实战指南:从核心对象到安全配置的C/C++开发详解

在网络安全与数据加密领域,TLS/SSL协议是实现安全通信的基石,广泛应用于HTTPS、API加密、物联网设备认证等场景。其核心原理是通过非对称加密协商会话密钥,再利用对称加密保护数据传输的机密性与完整性。OpenSSL作为业界广泛采用的密码学工具库,提供了从命令行工具到底层API的完整解决方案。直接调用OpenSSL API能够突破命令行黑盒的限制,实现对加密流程的精细控制,例如在自定义TLS客户端、嵌入式系统或高性能服务中集成双向认证、非阻塞I/O和特定密码套件。然而,其复杂的对象模型、易错的内存管理和

weixin_30619101的博客 355

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OpenSSL 3.x内存加载证书链:C/C++ TLS通信的安全实践

在TLS/SSL通信中,证书和密钥管理是保障安全连接的基础。传统文件加载方式存在安全风险与部署复杂性,尤其在云原生和容器化环境中更为突出。内存加载技术通过将证书数据直接从内存缓冲区加载到OpenSSL上下文,绕过了文件系统依赖,提升了密钥处理的安全性并简化了配置管理。这项技术特别适用于动态证书更新、配置中心集成以及只读文件系统环境。本文聚焦于OpenSSL 3.x的API变化,通过BIO抽象层和PEM解析函数,详细解析了从内存加载完整证书链(包括终端实体证书、中间CA证书和私钥)的实现原理与工程实践,并提供

weixin_34405354的博客 403

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OpenSSL QUIC 内部 JSON 编码器(JSON Encoder)设计与实现:面向 qlog 的零分配流式序列化方案

本文聚焦 OpenSSL 仓库中 QUIC 实现所依赖的内部 JSON 编码器(JSON Encoder),讲解其“零动态分配、即时输出、无中间语法树”的流式序列化设计,并完整覆盖其初始化、构建器 API、状态机、I-JSON 数字处理、JSON-SEQ 输出与延迟错误处理等核心机制。读者读完后,既能直接用该编码器写出高效的 JSON 序列化代码,也能理解它在 [qlog 支持](https://

gitblog_01001的博客 1050

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: openssl之BIO系列之6---BIO的IO操作函数
下一篇: openssl之BIO系列之9---BIO对的创建和应用
coo1fish
博客等级 码龄14年 22粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值