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或改用静态链接, 阅读详情

相关推荐

树莓派4B串口舵机控制全攻略:从pigpio库安装到Python脚本调试

本文详细介绍了如何在树莓派4B上通过pigpio库和Python脚本实现串口舵机的精确控制。从硬件串口配置、pigpio库安装到舵机通信协议解析和Python脚本开发,提供了完整的解决方案和调试技巧,适用于机械臂控制等实际项目应用。

k8s6orchestrator的博客 429

Socket编程(一)(BIO)

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

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

从0到1:.NET 9 OpenAPI全攻略!Swagger vs Scalar UI谁更强?

OpenAPI:.NET 9的智能文档革命 本文深入解析.NET 9的OpenAPI支持,对比Swagger UI与Scalar UI的优劣,提供实战代码示例: 一键生成:AddOpenApi()+MapOpenApi()快速生成标准文档 UI工具对决: Swagger UI功能全面但复杂 Scalar UI简约现代,原生支持cURL/HTTPie 进阶技巧: XML注释增强文档可读性 自定义Transformer实现文档动态修改 🔥核心价值:.NET 9的OpenAPI方案显著降低API文档维护成本,开

java专栏 1427

网络编程- 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

STM32实战——七段数码管动态扫描技术详解

本文详细解析了STM32控制七段数码管的动态扫描技术,包括硬件连接、CubeMX配置及编程实现。通过分时复用原理和优化代码逻辑,实现稳定显示效果,并解决亮度不均、闪烁等常见问题。适合嵌入式开发者快速掌握STM32数码管驱动技术。

weixin_42561143的博客 279

Halcon 3D视觉实战:5步将线激光高度数据转为可分析的深度图与点云

本文详细介绍了如何利用Halcon平台将线激光高度数据转换为深度图与点云的5步实战方法。通过具体代码示例和工业检测案例(如锂电池胶水测量),帮助工程师高效处理3D视觉数据,实现从原始数据到三维可视化的完整技术链路。

weixin_29039773的博客 361

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

故障排查:OpenClaw 更新后 feishu 插件路径失效的解决方法

OpenClaw 更新后 feishu 插件路径失效的解决方法发现问题→ Gateway 启动失败,报插件路径错误定位原因→ OpenClaw 目录结构变化,→解决问题→ 更新为正确的路径验证修复→ 使用确认一切正常。

刘一说的IT专栏 1304

GSoap工作原理简析

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

傲然君 4413

别让 Claude Code 一直问你“能不能执行“:权限配置完全指南

Claude Code 提供了一套精细的权限配置机制,配置好权限设置,可以提速不少。这个小技巧需要掌握一下。

沐风 3843

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之EcuC模块配置详解(上)

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之EcuC模块配置详解(上)

weixin_42412049的博客 1530

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

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

ciya3282的博客 199

MIPI D-PHY TX 一致性测试实例解析 Part 03

本文之前,已经讨论了MIPI D-PHY TX的1.3.x和1.4.x的测试项,1.5.x的测试项相对较少,主要是用于时钟和数据通道相关的时序测量

一只豌豆象的博客 5185

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

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

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Linux使用openssl对socket加密【2】

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

weixin_44836580的博客 696

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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、付费专栏及课程。

余额充值