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

从零实现Linux C语言WebSocket服务器:协议解析与网络编程实战 WebSocket作为一种在单个TCP连接上进行全双工通信的协议,已成为现代实时Web应用的核心技术。其核心原理在于通过一次HTTP握手完成协议升级,随后使用自定义的二进制帧格式进行高效数据传输。在技术实现层面,WebSocket协议的设计兼顾了安全性与效率,例如通过掩码机制防止缓存污染攻击,并支持分片传输以处理大消息。对于追求极致性能与底层控制的场景,如嵌入式系统、高性能中间件或定制化网络协议栈,使用C语言在Linux环境下原生实现WebSocket具有独特的工程价值。这要求开发者深入理解网络字节序、内存 阅读详情
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_get_fd(b,c) BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c)
     BIO *BIO_new_socket(int sock, int close_flag);
    前面我们在介绍fd类型BIO的时候曾经说过,它的函数的实现文件跟Soket类型的BIO其实是放在一起的,都在文件bss_socket.c里面,从这些定义我们就可以知道,之所以这样做,是因为这两种类型的BIO实现的函数基本是相同的,并且具有很多的共性。
    【BIO_s_socket】
    该函数返回一个Socket类型的BIO_METHOD结构,BIO_METHOD结构的定义如下:
    static BIO_METHOD methods_sockp=
     {
          BIO_TYPE_SOCKET,
          "socket",
          sock_write,
          sock_read,
          sock_puts,
          NULL, /* sock_gets, */
          sock_ctrl,
          sock_new,
          sock_free,
          NULL,
     };
    可以看到,它跟fd类型BIO在实现的动作上基本上是一样的。只不过是前缀名和类型字段的名称不一样。其实在象Linux这样的系统里,Socket类型跟fd类型是一样,他们是可以通用的,但是,为什么要分开来实现呢,那是因为有些系统如windows系统,socket跟文件描述符是不一样的,所以,为了平台的兼容性,openssl就将这两类分开来了。
    BIO_read和BIO_write对底层的Socket结构进行读写操作。
    BIO_puts是支持的,但是BIO_gets在Socket类型BIO中是不支持的,大家如果看源代码就可以知道,虽然BIO_gets在Socket类型是不支持的,但是如果调用该函数,不会出现异常,只会返回-1的出错信息。
    如果设置了关闭标志,那么当BIO被释放的时候底层的Socket连接就会被关闭。
    【BIO_set_fd】
    该函数将Socket描述符fd设置为BIO的底层IO结构,同时可以设置关闭标志c。该函数返回1。
    【BIO_get_fd】
    该函数返回指定BIO的Socket描述符,如果c参数不是NULL,那么就将该描述符存在参数c里面,当然,Socket描述符同时也作为返回值,如果BIO没有初始化则调用失败,返回-1。
    【BIO_new_socket】

    该函数根据给定的参数返回一个socket类型的BIO,成功返回该BIO指针,失败返回NULL。其实,该函数依次调用了BIO_s_socket,BIO_new和BIO_set_fd实现它的功能。


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

OpenSSL Windows 64位配置指南:头文件、lib与dll三件套详解 在Windows 64位环境下使用C/C++开发桌面或服务端程序时,OpenSSL几乎是绕不开的加密库。但要真正把OpenSSL集成进Visual Studio工程,往往卡在头文件、lib与dll的相互配合上:头文件为编译器提供接口声明,导入库或静态库为链接器提供符号定位,而dll在运行时提供实际实现。三者一旦版本错配或路径缺失,就会引发LNK2019、找不到dll或0xC000007B等典型错误。理解这套机制后,从配置环境变量、设置VS附加目录,到跑通SHA256示例,再到发布时部署dll或改用静态链接, 阅读详情

相关推荐

解决VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法

在启用了Credential Guard或Device Guard的Windows 10主机上启动12.5版之前的VMware Workstation中的虚拟机时,将显示蓝色诊断屏幕(BSOD)。 会看到类似于以下内容的错误: VMware Workstation和Device / Credential Guard不兼容。禁用Device / Credential Guard后,可以运行VMwar...

Hern(宋兆恒) 39万+

Socket编程(一)(BIO)

1.套接字地址 一个客户端要发起一次通信,首先要知道运行服务器端程序的主机IP地址。然后由网络基础设施利用目标地址将客户端发送的信息传递到正确主机上。在Java中,地址可以由一个字符串定义,可以是数字型的地址(192.168.1.10(IPv4地址),fe20:12a0::0abc:1234(IPv6地址)),也可以是主机名(www.baidu.com)。在后面的例子中,主机名必须被解析出数字型...

吃四碗饭的嘤嘤怪的博客 4687

【规则引擎连载3】 WebSphere ILOG JRules 开发——新建一个规则项目

规则项目依赖于bom,bom来自于一个Java项目,所以在建规则项目之前,需要先建立一个Java项目,也就是建模。 说明:原则上是一个规则项目,一个bom。如果规则项目很多,并且每个规则项目的bom都是一样的,那么可以将bom提取出来,单独作为一个项目,这样减少不必要的重复操作,减少维护成本,降低出错几率。这里逐步讲解两种方法来创建规则项目,推荐第二种。 本文主要建立两种规则项目与bom之间的关系,编写相关的规则内容,如操作规则、规则流、决策表等,在后续文章中详细讲解 。

manman的分享 2330

网络编程- Socket-BIO

网络编程- Scoket-BIO 上图时对socket做一个简单介绍, 具体的实现这里就说了。主要将一下java网络编程几大IO模型实现、原理、演变,IO模型分别为BIO、OS级别的NIO(NONBLOCKING IO)、NIO java jdk1.4升级的NEW IO。 BIO模型 前提知识:想要彻底的了解IO模型及其原理和演变,你需要了解一下操作系统底层相关的一些系统调用知识,我上篇文章介绍过了,参考学习,有错误的望指出。系统调用|内核程序 想必大家都知道IO操作肯定需要系统调用的,因为网络传输势必会

qq_31142237的博客 339

从零配置ORB-SLAM3:TUM-VI数据集yaml文件参数调优指南

本文深入解析了ORB-SLAM3在TUM-VI数据集上的yaml配置文件参数调优方法。针对双目惯性模式,详细拆解了相机标定、IMU噪声模型和ORB特征提取三大模块的关键参数,解释了其原理与影响,并通过实战案例展示了如何通过调整特征点数量、FAST阈值及IMU噪声参数,有效提升系统在低纹理环境下的鲁棒性和轨迹精度。

weixin_29071809的博客 151

DRV8870电机驱动芯片原理与嵌入式多平台驱动开发

H桥电机驱动芯片是直流电机控制的核心硬件模块,其通过双MOSFET拓扑实现方向与速度的精确调控。工作原理基于电荷泵自举驱动、集成电流检测及多重硬件保护机制,技术价值体现在高集成度、宽压适配(4.5V–45V)与强鲁棒性。典型应用场景涵盖智能机器人执行器、工业自动化设备及电池供电移动终端。本文围绕DRV8870这一主流驱动芯片,深入解析其PH/EN与Dual PWM双控制模式、nFAULT故障响应机制,并结合Arduino/ESP32/STM32三大平台,提供可复用的跨MCU驱动库设计范式与FreeRTOS实

weixin_32251525的博客 656

OpenSSL 编程指南

前言 初始化SSL库 创建SSL 上下文接口(SSL_CTX) 安装证书和私钥 加载证书(客户端/服务端证书) 加载私钥 加载CA证书 设置对端证书验证 例1 SSL服务端安装证书 例2 客户端安装证书 创建和安装SSL结构 1建立TCP/IP连接 客户端创建socket 服务端创建连接 创建SSL结构中的BIO SSL握手 服务端SSL握手 客户端握手 通过SSL_read以及SSL_write完成握手(可选的) 获取对端证书(可选) 数据传输 发送数据 接收数据 使用BIOs接口进行数据传输(可选的)

zhuguanlin121的博客 4027

探索LLM世界:新手小白的学习路线图

通过系统的学习和实践,新手小白也能逐步掌握LLM的核心技术。掌握LLM不仅能提升个人技术水平,还能为职业发展带来广阔的前景。未来,随着技术的不断进步,LLM将在更多领域发挥重要作用,成为推动科技进步的重要力量。学习LLM是一条充满挑战但也充满机遇的道路。只要你坚持不懈、不断学习和实践,就一定能够在LLM领域取得突破。希望本文提供的学习路线图能为你指明方向,助你早日掌握LLM,开启AI学习的新篇章!

m0_62110645的博客 2360

GSoap工作原理简析

前言 因为工作原因,接触GSoap已有大半年时间,春节闲来无事,简单写一下半年来对GSoap的理解。 服务端int main() {#ifdef WITH_OPENSSL//1、初始化OpenSSL(系统会自动初始化SSL,故可跳过此函数) //函数会调用SSL_library_init()、OpenSSL_add_all_algorithms()、SSL_load_error_strings(

傲然君 4413

Python爬虫教程:抓取区块链交易信息及加密货币市场数据

随着区块链技术和加密货币的迅猛发展,区块链交易和加密货币市场的数据逐渐成为金融、技术、经济研究等领域的热点。对于开发者和研究者而言,实时获取区块链交易数据和加密货币市场行情,对于投资分析、市场预测、技术研究等具有重要的参考价值。本文将通过Python爬虫技术,介绍如何抓取区块链交易信息及加密货币市场数据,详细阐述数据获取的原理、技术方案、实现方法以及抓取到的数据的存储与分析。我们将依托最新的爬虫技术,如requestsSeleniumScrapy,以及相关的数据处理库(如pandasmatplotlib。

2201_76125261的博客 2777

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

基于 高斯过程回归(Gaussian Process Regression, GPR) 的 时间序列区间预测 的 MATLAB 示例代码

算法如诗的博客 153

openssl之BIO系列之13---Socket类型BIO (转)

openssl之BIO系列之13---Socket类型BIO (转)[@more@] ...

ciya3282的博客 199

ardupilot 日志分析《xKF1信息》

ardupilot 日志分析系列将会把ardupilot所有的日志文档进行分析,为我们分析无人机的运行状态,炸鸡原因,传感器状态,电机状态,控制信息,滤波信息做准备。本节主要分析xKF1日志信息,欢迎批评指正。学习好ardupilot必须会分析飞行日志,从飞行日志中我们可以学到很多无人机的知识。无人机是综合知识的体现,涵盖:导航、控制、滤波、算法、协议等各种知识,只有更全面的学习,才能在无人机的道路上越走越远。

陌城烟雨 1225

openssl之BIO系列之10---BIO链的定位操作

BIO链的定位操作     ---根据openssl doc/crypto/bio/bio_find_type.pod翻译和自己的理解写成          (作者:DragonKing Mail:wzhah@263.net 发布于:http://gdwzh.126.com之openssl专业论坛)          前面的一篇文章讲过BIO链的构造方法,这里讲的是在一个BIO链中,怎么

潇汀 8184

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Linux使用openssl对socket加密【2】

上一篇博客介绍了使用openssl对socket加密使用到的库函数,也解决了上一篇博客中说到的问题,首先就是要生成openssl证书,大家可以参考本篇博客(https://blog.youkuaiyun.com/fly2010love/article/details/46415307),就不多说了。 还有一个问题就是编译的问题,刚开始我以为是库没安装好,其实是没有生成证书,而且使用gcc编译的时候要使用-L参...

weixin_44836580的博客 696

VB摄像头监控

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

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

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

chuiqi9947的博客 374

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux安全体系学习笔记之四:OpenSSL源代码分析(3)

BIO是对IO操作的封装,OpenSSL的BIO抽象接口不仅可以对SSL连接的I/O使用,也可以对非加密的网络连接和文件的I/O使用。BIO的相关源代码在crypto/bio文件夹下。 BIO的相关数据结构列出如下。 BIO结构: struct bio_st { BIO_METHOD *method; /* bio, mode, argp, argi, argl, ret */

Aegeaner的专栏 2249

Windows平台OpenSSL源码编译与集成实战指南

加密与安全通信是现代软件开发的基础需求,其核心在于可靠的加密库。OpenSSL作为功能完备的开源安全套接字层密码库,实现了SSL/TLS协议并封装了主流密码算法,是构建安全应用的基石。在Windows平台进行开发时,直接使用预编译二进制库常会遇到版本不匹配和ABI兼容性问题,导致部署困难。通过从源码编译OpenSSL,开发者能获得完全的版本控制与深度定制能力,例如针对特定算法进行裁剪或编译为静态库以简化部署。这项技能对于需要实现HTTPS通信、数据签名验签或构建双向认证系统的工程实践至关重要,能有效解决依赖

weixin_33910385的博客 387

GmSSL 编译与 Qt 项目集成问题排查记录(-lssl-1_1-x64 -lcrypto-1_1-x64)

本文记录了在Windows环境下将GmSSL国密库集成到Qt项目中的完整过程。首先发现项目依赖GmSSL特有的SM2算法函数而非标准OpenSSL,随后尝试了GmSSL 3.x版本但缺少所需接口,最终定位到GmSSL-gmbrowser-v0.1版本。编译过程中解决了Perl配置错误、socket参数类型不匹配、Windows类型重定义等6个关键问题。在Qt项目中通过修改.pro文件添加库路径和依赖项,最终成功构建。整个过程展示了老旧开源库在新环境下的兼容性挑战及解决方案,为类似项目集成提供了实用参考。

Java、C语言、嵌入式开发,计算机科学与技术专业 560

boost::asio tlsv13_client 使用“boost::asio::ip::tcp::socket” 为 lowest_layer

根证书头文件:(或者从根证书文件里面载入,OpenSSL、libcurl 都带了对应的 cacert.pem 根证书密钥文件的) beast/root_certificates.hpp at develop · boostorg/beast (github.com) 官方提供的示例代码,但它是通过 boost::beast::tcp_stream 实现的,本文提供调用 boost::asio::ssl_v13 的示例代码,低级层为 asio 提供的 boost::asio::ip::tcp::sock.

liulilittle的博客 2524

CPython `ssl` 模块权威指南:TLS/SSL 套接字封装、证书验证与安全最佳实践

本文以 CPython 官方标准库参考文档 [Doc/library/ssl.rst](https://link.gitcode.com/i/ff696bed28ce0615446c2db07affa812) 为骨架,系统讲解 Python `ssl` 模块:它为网络套接字(客户端与服务端两侧)提供基于 OpenSSL 库的传输层安全(Transport Layer Security,通常仍被称为

gitblog_00332的博客 352

翼支付订单查询:超级收银台与线下聚合双通道实战指南(yansongda/pay)

翼支付(中国电信翼支付商户开放平台,MAPI)在 yansongda/pay 中提供了统一的 `query` 快捷方法,一条 API 即可覆盖「超级收银台(1008)」与「线下聚合(1006)」两类订单的查询。本文将围绕 [查询文档](https://link.gitcode.com/i/73b542912d20e4fd7dd2840a6fea0786) 的完整内容,结合仓库源码深入讲解两种查询方

gitblog_00492的博客 638
上一篇: openssl之BIO系列之12---文件描述符(fd)类型BIO
下一篇: openssl之BIO系列之15---内存(mem)类型BIO
coo1fish
博客等级 码龄14年 22粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值