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

相关推荐

告别手动翻页!用幻影联动+DLL调用,5分钟搞定通达信分时指标自动选股

本文详细介绍了如何利用幻影联动软件结合DLL调用技术,实现通达信分时指标的自动化选股。通过改造指标代码和配置幻影联动任务,用户可以在5分钟内完成从信号检测到自动报警的全流程,大幅提升短周期交易的效率和准确性。

weixin_42561040的博客 767

Socket编程(一)(BIO)

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

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

Voicebox本地部署:模型下载与离线模式实战指南

在本地语音处理场景中,模型下载失败和离线运行需求是开发者最常遇到的两大难题。理解语音工具的本地推理原理,关键在于掌握模型文件与程序逻辑的分离管理:模型独立下载,程序负责推理,输出留在本机。这种架构带来显著的技术价值——数据不出本地、不依赖公网、批量任务不中断。无论是语音识别转写、语音合成,还是集成到自动化脚本中,本地离线模式都能在隐私敏感或网络不稳定环境下稳定运行。对开发者而言,先解决模型文件的完整获取,再验证离线启动流程,就能绕过“无法下载模型”的常见坑。本文从环境准备、模型放置、服务启动到接口调用,提供

weixin_29048309的博客 307

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

Palabos User Guide中文解读 | 第五章 | Palabos编程 (跳过了第四章Palabos-Java接口)

作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of Geneva Jul...

Yulan Fang's notes. 2298

Bertopic库安装(二)

Bertopic库安装

weixin_43392789的博客 4893

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

【SpringBoot 3.x 第92节】Spring Modulith:构建模块化单体架构(基于 Spring Boot 3),一文带你搞透(超详细)!

🏆本文收录于《滚雪球学SpringBoot 3.x》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

**My Coding Family** 999

GSoap工作原理简析

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

傲然君 4413

红火蚁巢穴AI智能识别,提供方案与思路!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1042

AI应用架构师视角:AI技术引发的全球经济格局重构,你看懂了吗?

本文将从AI应用架构师的独特视角,拆解AI技术栈(算力/算法/数据)如何通过"架构渗透"重塑产业价值链,分析中美欧等主要经济体的AI战略差异如何改写全球分工格局,并为企业与个人提供一套可落地的"AI经济适应性框架"。当OpenAI的GPT-4在代码生成、多模态理解上展现出超越人类的能力,当英伟达的H100芯片成为全球科技巨头争抢的"数字石油",当中国的AI大模型在电商、金融等场景实现规模化落地——我们正站在一场由AI技术引发的全球经济重构的临界点上。AI重构全球经济格局的过程,既是挑战,更是机遇。

小白菜的博客 1258

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

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

ciya3282的博客 199

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

数学建模模型总结

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux使用openssl对socket加密【2】

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

weixin_44836580的博客 696

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

chuiqi9947的博客 374

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

余额充值