当前位置: 首页 > news >正文

SslConnection::SslConnection()详解

一、🔍 SslConnection::SslConnection() 详解

这个构造函数的主要作用是:

  1. 创建 SSL 对象
  2. 创建 BIO(I/O 缓冲区)
  3. 初始化 SSL 服务器模式
  4. 绑定回调函数(onRead() 处理接收数据)

📌 1. 初始化 SSL 相关对象

SslConnection::SslConnection(const TcpConnectionPtr& conn, SslContext* ctx): ssl_(nullptr)  // SSL对象(加密/解密), ctx_(ctx)  // SSL 上下文, conn_(conn)  // Muduo 连接对象(底层网络传输), state_(SSLState::HANDSHAKE)  // 初始状态:TLS 握手, readBio_(nullptr)  // 读 BIO(接收加密数据), writeBio_(nullptr)  // 写 BIO(存储加密数据), messageCallback_(nullptr)  // 业务逻辑的回调(不一定用得上)

💡 这里主要是初始化了一些成员变量,确保构造对象时数据是干净的。


📌 2. 创建 SSL 上下文

ssl_ = SSL_new(ctx_->getNativeHandle());
if (!ssl_) {LOG_ERROR << "Failed to create SSL object: " << ERR_error_string(ERR_get_error(), nullptr);return;
}

📍 作用

  • 通过 SSL_new(ctx_->getNativeHandle()) 创建 SSL 对象,用于加解密。
  • 如果失败,打印日志并返回。

🔹 ctx_->getNativeHandle() 是什么?

  • 这里的 ctx_SslContext*,表示 SSL 的全局上下文。
  • ctx_->getNativeHandle() 返回的是 OpenSSL 的 SSL_CTX*,它管理 证书、加密方式、TLS 版本等
  • SSL_new() 基于 SSL_CTX* 创建一个 新的 SSL 会话对象,用于该 TCP 连接的数据加解密。

📌 3. 创建 BIO(I/O 缓冲区)

readBio_ = BIO_new(BIO_s_mem());
writeBio_ = BIO_new(BIO_s_mem());if (!readBio_ || !writeBio_) {LOG_ERROR << "Failed to create BIO objects";SSL_free(ssl_);ssl_ = nullptr;return;
}

📍 作用

  • readBio_ = BIO_new(BIO_s_mem()):创建 读 BIO,用于存放接收的加密数据(网络数据)。
  • writeBio_ = BIO_new(BIO_s_mem()):创建 写 BIO,用于存放加密后的待发送数据
  • 这里使用 BIO_s_mem(),表示创建的是 内存 BIO(不会自动关联 socket,手动读写)。
  • 如果创建 BIO 失败,则释放 SSL 资源,防止内存泄露。

📌 4. 绑定 SSL 和 BIO

SSL_set_bio(ssl_, readBio_, writeBio_);

📍 作用

  • 让 OpenSSL 通过 BIO 读写数据,而不是直接操作 socket。
  • readBio_ 存放接收到的加密数据(模拟 OpenSSL 的 SSL_read())。
  • writeBio_ 存放加密后的待发送数据(模拟 SSL_write())。
  • SSL_set_bio() 绑定 BIO 后,SSL_read() 会自动从 readBio_ 读取数据,SSL_write() 会把加密数据存入 writeBio_

💡 这样就实现了 OpenSSL 和 Muduo 的解耦:

  • Muduo 只管传输数据(读写 readBio_writeBio_)。
  • SSL 只管加密/解密(不直接接触网络)。

📌 5. 设置服务器模式

SSL_set_accept_state(ssl_);  // 设置为服务器模式

📍 作用

  • 服务器模式:在 TLS 握手时,服务器等待客户端发起 Client Hello
  • 服务器通过 SSL_accept() 进行 TLS 握手,成功后才能进行加密通信。

📌 6. 设置 SSL 选项

SSL_set_mode(ssl_, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE);

📍 作用

🔹 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER

  • 允许 SSL_write() 使用动态内存,不要求数据缓冲区保持固定位置(适用于异步网络)。

🔹 SSL_MODE_ENABLE_PARTIAL_WRITE

  • 允许 SSL_write() 部分写入,在数据较长时,不会阻塞,而是先写入部分数据,后续继续发送。

📌 7. 绑定数据接收回调

conn_->setMessageCallback(std::bind(&SslConnection::onRead, this, std::placeholders::_1,std::placeholders::_2, std::placeholders::_3));

📍 作用

  • conn_ 是 Muduo 的 TCP 连接,它接收加密数据后,会调用 onRead() 处理。
  • onRead() 主要作用:
    1. 先把 加密数据 写入 readBio_
    2. 调用 SSL_read() 解密数据
    3. 解密后的数据交给业务逻辑处理。

🎯 8. 总结

🚀 整个 SslConnection 的构造逻辑可以总结如下:

  1. 创建 SSL 对象(用于加密/解密)。
  2. 创建 BIOreadBio_ 存接收数据,writeBio_ 存待发送数据)。
  3. 绑定 BIO(让 SSL_read() / SSL_write() 读写 BIO)。
  4. 设置 SSL 服务器模式SSL_set_accept_state())。
  5. 设置 SSL 选项(允许 SSL_write() 使用动态内存、支持部分写入)。
  6. 绑定 onRead() 回调,处理 Muduo 网络层的数据。

💡 9. 你的代码和 Muduo/SSL 之间的关系

  • Muduo 负责底层的 TCP 连接和数据收发
  • SSL 负责 TLS/SSL 加解密,但不直接读写 socket,而是通过 BIO 缓冲区进行数据交互。
  • Muduo 只管传输,SSL 只管加解密,BIO 作为中间桥梁

🚀 这套架构解耦了网络层和加密层,这样可以:

  1. 更灵活:BIO 让 SSL 适配不同的 I/O(可以换成文件、内存等)。
  2. 更高效:Muduo 依旧是 非阻塞 IO,BIO 负责数据缓存,不阻塞线程。
  3. 更安全:SSL 加密的数据 Muduo 无法直接解读,避免安全漏洞。

🛠 10. 你可以改进的地方

异常处理更全面

  • 目前如果 SSL_new() 失败,只是打印日志并 return,可以抛出异常或者返回错误码,更容易排查问题。

考虑 BIO_set_mem_eof_return()

  • BIO_s_mem() 可能会在 BIO_read() 读取完数据后返回 0,导致 SSL_read() 误以为连接断开。可以用:
    BIO_set_mem_eof_return(readBio_, -1);
    BIO_set_mem_eof_return(writeBio_, -1);
    
    这样 SSL_read() 还能继续读取新数据。

这部分代码设计得 很合理,核心逻辑非常清晰,已经符合 高性能、可扩展、解耦的要求!🚀

二、为什么使用BIO_s_mem()

OpenSSL 里 BIO(Basic I/O) 有多种类型,而 BIO_s_mem() 只是其中之一。
你可以理解 BIO 就是 OpenSSL 里数据的输入/输出缓冲区,不同类型的 BIO 代表不同的 I/O 方式。


📌 1. OpenSSL 里的 BIO 类型

OpenSSL 提供了 三种主要 BIO,分别是:

BIO 类型描述适用于
BIO_s_socket()直接操作 socket 读写阻塞式网络编程
BIO_s_mem()纯内存缓冲区,需要手动传输数据非阻塞网络、框架
BIO_s_ssl()直接包裹 SSL*,自动处理内部封装更简单

🚀 你这里用了 BIO_s_mem(),它的特点是:

不会自动关联 socket(灵活,可适配任何网络框架)
手动读写数据(Muduo 负责收发,BIO 只是缓存)
适用于事件驱动框架(如 Muduo)


📌 2. BIO_s_mem() 为什么适合 Muduo?

Muduo 是 非阻塞 + 事件驱动 的框架,而 OpenSSL 默认的 SSL_read() / SSL_write() 设计成了 阻塞式,所以直接用 OpenSSL 的 BIO_s_socket() 会导致阻塞整个事件循环,影响服务器性能。

💡 解决方案:使用 BIO_s_mem() 让 Muduo 负责数据收发,OpenSSL 只管加解密。

🌟 BIO_s_mem() 允许这样做:

  1. Muduo 读取 TCP 数据,然后 写入 readBio_
    BIO_write(readBio_, encryptedData, len);
    
  2. OpenSSL 从 readBio_ 里读取数据并解密
    SSL_read(ssl_, decryptedBuffer, len);
    
  3. OpenSSL 处理完数据,调用 SSL_write() 生成加密数据,存入 writeBio_
    SSL_write(ssl_, plaintextData, len);
    
  4. Muduo 负责从 writeBio_ 读取加密数据并发送给客户端
    BIO_read(writeBio_, encryptedBuffer, len);
    sendToClient(encryptedBuffer, len);
    

这样,Muduo 仍然是非阻塞的,BIO 只是一个中间缓冲区,不会影响 Muduo 的事件循环。


📌 3. 其他 BIO 方式为什么不合适?

🚫 BIO_s_socket() 直接绑定 socket

如果你用了 BIO_s_socket(),那么:

  • SSL_read() / SSL_write() 会直接阻塞,导致 Muduo 线程被卡住。
  • 影响服务器性能,不能高并发处理多个连接。

🚫 BIO_s_ssl() 让 OpenSSL 直接处理 I/O

  • 这个 BIO 适用于简单场景,适合自己管理 socket 的程序,比如同步服务器。
  • 但你用的是 Muduo 事件驱动,要自己控制数据流动,所以不适合。

📌 4. 总结

你这里使用 BIO_s_mem() 的原因:

  1. 适配 Muduo 非阻塞模型,不会让 SSL_read() 阻塞线程。
  2. 灵活控制数据流动,BIO 只是缓冲区,Muduo 仍然管理 TCP 读写。
  3. 高性能,避免 OpenSSL 直接操作 socket 导致的效率问题。

🚀 这就是 BIO_s_mem() 在 Muduo 里的最佳应用场景!

相关文章:

SslConnection::SslConnection()详解

一、&#x1f50d; SslConnection::SslConnection() 详解 这个构造函数的主要作用是&#xff1a; 创建 SSL 对象创建 BIO&#xff08;I/O 缓冲区&#xff09;初始化 SSL 服务器模式绑定回调函数&#xff08;onRead() 处理接收数据&#xff09; &#x1f4cc; 1. 初始化 SSL 相…...

unity lua属性绑定刷新

我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候&#xff0c;我们需要刷新界面显示等级信息&#xff0c;通常我们是在收到等级升级成功的协议的时候&#xff0c;发送一个事件&#xff0c;UI界面接受到这个事件的时候&#xff0c;刷新一下等级…...

Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks

Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks ​#paper/GFM/GNN-BASED#​ #paper/⭐⭐⭐#​ 注意&#xff1a;这篇文章是每个图一个GCN模型&#xff0c;而不是所有图一个GCN 模型 算是最早的涉及异配图的prompt了 贡献和动机&#xff1a; 非对…...

企业级-数据分类分级详细方案

一、方案背景 在数字化时代,数据成为企业和组织的核心资产。随着数据量的快速增长和数据应用场景的不断拓展,如何有效地管理和保护数据,确保数据的安全性、合规性和可用性,成为了亟待解决的问题。数据分类分级作为数据管理的基础工作,能够帮助企业清晰地了解自身的数据资…...

本地部署Qwen2.5-VL-7B-Instruct模型

本地部署Qwen2.5-VL-7B-Instruct模型 本地部署Permalink **创建环境** conda create -n qwenvl python3.11 -y# 报错&#xff1a; Solving environment: failedPackagesNotFoundError: The following packages are not available from current channels:# 处理&#xff1a; c…...

【前端】简单原生实例合集html,css,js

长期补充&#xff0c;建议关注收藏点赞。 目录 a标签设置不一样的花样&#xff08;图片但不用img)侧边固定box分栏input各种类型iframe表单拖拽 a标签设置不一样的花样&#xff08;图片但不用img) a标签里面不用嵌套img&#xff0c;直接设置为其bg-img即可 <!DOCTYPE html…...

【Spring】配置文件的使用

在Spring框架中&#xff0c;application.properties&#xff08;或application.yml&#xff09;文件用于配置Spring应用程序的各种属性。我们可以通过多种方式来使用这些配置&#xff0c;包括使用Value和ConfigurationProperties注解来绑定配置到Java对象。 下面是对不同配置类…...

MOM成功实施分享(七)电力电容制造MOM工艺分析与解决方案(第一部分)

声明&#xff1a;文章仅用于交流学习&#xff0c;不用于商业项目实施&#xff0c;图片来源于网络&#xff0c;如有侵犯权利&#xff0c;请联系作者及时删除。 本方案旨在对电力电容&#xff08;PEC和PQM型号&#xff09;制造工艺深度分析&#xff0c;结合管理要求设计MOM相关功…...

计算机毕业设计SpringBoot+Vue.js航空机票预定系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…...

【二.提示词工程与实战应用篇】【3.Prompt调优:让AI更懂你的需求】

最近老张在朋友圈秀出用AI生成的国风水墨画,隔壁王姐用AI写了份惊艳全场的年终总结,就连楼下小卖部老板都在用AI生成营销文案。你看着自己跟AI对话时满屏的"我不太明白您的意思",是不是怀疑自己买了台假电脑?别慌,这可能是你的打开方式不对。今天咱们就聊聊这个…...

商城源码的框架

商城源码的框架通常是基于某种Web开发框架或者电子商务平台来构建的。以下是一些常见的商城源码框架&#xff1a; WooCommerce&#xff1a;基于WordPress的电子商务插件&#xff0c;适用于小型到中型的在线商店。 Magento&#xff1a;一个功能强大和灵活的开源电子商务平台&am…...

WordPress如何防Webshell、防篡改、防劫持,提升WP漏洞防护能力

WordPress是一款世界知名的CMS系统&#xff0c;不仅可以创建博客网站&#xff0c;还可以用于建设企业网站、下载网站、商城等各类网站。功能非常强大、结构科学合理&#xff0c;深受广大用户喜欢。 虽然WordPress非常优秀&#xff0c;但是为了保障网站安全&#xff0c;我们还是…...

Android Flow 示例

在Android开发的世界里&#xff0c;处理异步数据流一直是一个挑战。随着Kotlin的流行&#xff0c;Flow作为Kotlin协程库的一部分&#xff0c;为开发者提供了一种全新的方式来处理这些问题。今天&#xff0c;我将深入探讨Flow的设计理念&#xff0c;并通过具体的例子展示如何在实…...

刚安装docker并启动docker服务: systemctl restart docker报错解决

root:/home/lzw# sudo systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xeu docker.service" for details. 1、问题描述 启动doc…...

xss笔记与打靶(更新中)

这个文章好 https://blog.csdn.net/huangyongkang666/article/details/123624164?fromshareblogdetail&sharetypeblogdetail&sharerId123624164&sharereferPC&sharesource2401_88818565&sharefromfrom_link 什么是xss XSS&#xff08;跨站脚本攻击&…...

游戏引擎学习第133天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并设定今天的主题 今天的任务是进一步优化背景资源的流式加载&#xff0c;尤其是在内存管理方面。昨天&#xff0c;我们实现了资源流式加载&#xff0c;让游戏在加载时可以动态地加载背景&#xff0c;而不是一开始就把所有资…...

【鸿蒙操作系统】- 1:实习阶段的一些总结

本文目录 1. 序2.鸿蒙与欧拉的概念微内核LiteOS鸿蒙微内核POSIX标准 3.实习干了些什么身份鉴别访问控制恶意代码防范安全审计入侵防范性能压测检查系统版本网络测试常见的linux测试命令 1. 序 之前在某国企实习的时候&#xff0c;有幸参与了鸿蒙系统、鸿蒙欧拉的项目&#xff…...

Qt基础入门-详解

前言 qt之路正式开启 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44…...

【前端】HTML 备忘清单(超级详细!)

文章目录 入门hello.html注释 Comment段落 ParagraphHTML 链接Image 标签文本格式标签标题Section Divisions内部框架HTML 中的 JavaScriptHTML 中的 CSS HTML5 标签页面标题导航HTML5 TagsHTML5 VideoHTML5 AudioHTML5 RubyHTML5 kdiHTML5 progressHTML5 mark HTML 表格Table …...

优化算法中的‘0.618’魔法:黄金分割法为何是工程优化的首选入门工具?

黄金分割法&#xff1a;从古希腊美学到现代工程优化的优雅解决方案 在工程优化领域&#xff0c;算法选择往往让初学者感到困惑。面对梯度下降、牛顿法等复杂方法&#xff0c;有一种源自公元前300年的数学比例——黄金分割比&#xff08;0.618&#xff09;&#xff0c;却成为了…...

LeetCode 11. Container With Most Water 题解

LeetCode 11. Container With Most Water 题解 题目描述 给你 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条…...

2026年Win11强力清理工具推荐:安全无广告的C盘瘦身软件怎么选?

我是个学生党&#xff0c;笔记本电脑的C盘从买回来就没清理过&#xff0c;最近装新游戏时直接提示空间不足。网上搜“Win11强力清理工具推荐”&#xff0c;跳出来一堆软件&#xff0c;看着都挺好&#xff0c;但又怕下载到带捆绑、弹广告的流氓软件。我只是想要一个能真正把C盘腾…...

Windows右键菜单效率革命:ContextMenuManager极简操作与深度定制指南

Windows右键菜单效率革命&#xff1a;ContextMenuManager极简操作与深度定制指南 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 每天面对电脑上杂乱的右键菜单&…...

抖音批量下载终极指南:3分钟掌握高效无水印下载技巧

抖音批量下载终极指南&#xff1a;3分钟掌握高效无水印下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

Qwen3.5-9B惊艳案例:128K上下文下跨页PDF内容精准摘要

Qwen3.5-9B惊艳案例&#xff1a;128K上下文下跨页PDF内容精准摘要 1. 模型核心能力展示 Qwen3.5-9B作为一款90亿参数的开源大语言模型&#xff0c;在多个领域展现出令人印象深刻的能力。我们特别测试了其在处理长文档时的表现&#xff0c;结果令人惊喜。 1.1 长上下文处理能…...

QODER

...

S2-Pro自动化运维脚本生成:应对Linux服务器常见管理任务

S2-Pro自动化运维脚本生成&#xff1a;应对Linux服务器常见管理任务 1. 运维工程师的新助手 最近遇到个挺有意思的事。我们团队新来的运维小哥&#xff0c;处理服务器问题时总要先翻半天文档&#xff0c;再到处搜脚本模板。看着他手忙脚乱的样子&#xff0c;我突然想起自己刚…...

S2-Pro模型管理利器:Ollama国内镜像源加速下载与使用

S2-Pro模型管理利器&#xff1a;Ollama国内镜像源加速下载与使用 1. 为什么需要国内镜像源 如果你在国内使用Ollama管理S2-Pro等大模型&#xff0c;可能经常遇到下载速度慢、连接不稳定甚至完全无法拉取模型的问题。这是因为默认的模型仓库位于海外服务器&#xff0c;受网络环…...

看完就会:高效论文写作全流程AI论文平台推荐(2026 最新)

论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节&#xff0c;以下2026年AI论文平台按环节精准匹配&#xff0c;兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求&#xff0c;覆盖免费/付费、通用/垂直场景…...