如何在非阻塞套接字上处理 OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE

2024-04-04

OpenSSL 库允许使用 SSL_read 从底层套接字读取数据并使用 SSL_write 写入数据。这些函数可能会返回 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE,具体取决于它们的 ssl 协议需求(例如,重新协商连接时)。

我不太明白 API 希望我对这些结果做什么。

想象一个接受客户端连接的服务器应用程序,设置一个新的 ssl 会话,使底层套接字成为非阻塞,然后将文件描述符添加到 select/poll/epoll 循环。

如果客户端发送数据,主循环会将其分派给 ssl_read。如果返回 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE,这里必须做什么? WANT_READ 可能很容易,因为下一个主循环迭代可能会导致另一个 ssl_read。但是如果 ssl_read 返回 WANT_WRITE,应该使用什么参数来调用它?为什么图书馆不自己发出呼叫?

如果服务器想要向客户端发送一些数据,它将使用 ssl_write。再说一遍,如果返回 WANT_READ 或 WANT_WRITE 该怎么办?是否可以通过重复刚刚调用的同一调用来应答 WANT_WRITE?如果返回 WANT_READ,是否应该返回主循环并让 select/poll/epoll 处理这个问题?但是首先应该写的消息呢?

或者应该在写入失败后立即进行读取?那么,当真正的解析器位于主循环中时,什么可以防止从应用程序协议读取字节,然后必须在应用程序外围的某个地方处理它呢?


使用非阻塞套接字,SSL_WANT_READ means “等待套接字可读,然后再次调用此函数。”;反过来,SSL_WANT_WRITE means “等待套接字可写,然后再次调用此函数。”。你可以得到SSL_WANT_WRITE or SSL_WANT_READ来自两个SSL_read() or SSL_write() call.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在非阻塞套接字上处理 OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE 的相关文章

  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 使用 paramiko 运行 Sudo 命令

    我正在尝试执行sudo使用 python paramiko 在远程计算机上运行命令 我尝试了这段代码 import paramiko ssh paramiko SSHClient ssh set missing host key polic
  • Socket.io 400(错误请求)

    我的服务器上有这段代码 var express require express var routes require routes var user require routes user var http require http var
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • Java 套接字 - 如何模拟多个客户端

    我有一个用Java编写的套接字程序 服务器使用 DatagramSocket 创建具有特定端口号的套接字 我有一个客户端java程序 它连接到该服务器并发送一些消息 目前我有 3 台笔记本电脑 因此我使用 1 台运行服务器 其余 2 台作为
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两

随机推荐

  • 如何执行下一个按钮操作?

    我在显示下一个问题时在 下一步 按钮中遇到问题 在我第一次设置文本时 我得到了正确的问题并匹配了四个选项答案 我需要的是 我有一个 下一步 按钮 用于显示下一个问题和答案 当我单击 下一步 按钮时 我可以获得下一个问题的接下来的四个选项 但
  • 如何在 C# 中绘制面板?

    嘿 我需要在 C 中的面板上进行绘图 但没有将绘图代码放在 panel1 Paint 中 我该怎么做 顺便说一句 我正在使用 WinForms Update 我忘了说清楚 我不需要将绘图代码放在绘图处理程序中 因为我需要根据按钮的事件开始绘
  • 打印一个字符*

    我提前为这个愚蠢的问题道歉 这是我的结构定义 struct vcard char cnet char email char fname char lname char tel 我正在尝试使用函数 vcard show vcard c 打印此
  • 使用 gridSVG 和 ggplot2 v.0.9.0 进行交互式点标签

    我想以交互方式在 ggplot 中标记点 以便将鼠标悬停在点上会显示标签 我正在尝试调整给出的答案这个问题 https stackoverflow com questions 8972642 how do you relate ggplot
  • 贝叶斯评级

    avg num votes 18 Average number of votes in all products avg rating 3 7 Average rating for all products this num votes 6
  • 如何在 Highcharts 组织结构图中启用拖放功能?

    我需要设置一个 组织 类型的 Highcharts 图表 它应该支持相互拖放节点 以移动树内的节点 目前 我得到了一个 组织 图表 其中显示了所有需要的信息 我尝试使用Highcharts plotOptions series dragDr
  • 使用文件夹结构迭代 S3 存储桶中的文件

    我有一个 S3 存储桶 在存储桶内 我们有一个 2018 年的文件夹 以及我们每个月和每天收集的一些文件 例如 2018 3 24 2018 3 25 等等 我们没有将日期放入每天存储桶内的文件中 基本上 我想遍历存储桶并使用文件夹结构按
  • 张量流中值

    如何计算张量流中列表的中值 喜欢 node tf median X X 是占位符在numpy中 我可以直接使用np median来获取中值 如何在tensorflow中使用numpy运算 用于计算数组的中位数tensorflow你可以使用p
  • Angular.js - 使用间隔应用过滤器

    我正在对日期时间对象使用自定义 angular js 过滤器 function relativeTimeFilter return function dateObj return getRelativeDateTimeString date
  • 与 SVN 上游同步工作[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在开发一个使用开源项目代码的项目 要求之一是将尽可能多的代码推回到上游 远程项目正在使用 Subversion 不是很好 我当前的
  • 为什么我不能转换 ref 参数?

    我有一个带有 ref 控件类型参数的方法 我想通过传递 ref 按钮类型参数来调用该方法 那么编译器不接受这一点 我必须将引用控件类型更改为引用按钮类型 Why 因为这会带来很多问题 public void DoDarkMagic ref
  • 克隆 MongoDB 中的集合

    我想克隆 MongoDB 集合并将其以不同的名称保存在同一服务器上 例如 现在我有以下集合 demo1 categories demo1 users 和 demo2 users 我想要一个与 demo1 categories 相同的 dem
  • 如何转义双引号作为 NUnit TestCase 的参数?

    我尝试为用 VB net 编写的 NUnit 测试编写以下 TestCase
  • 如何将同义词词典添加到mysql全文搜索?

    这样 如果我搜索术语 男士 术语 绅士 就会匹配 我试过这个 SELECT FROM cart product WHERE MATCH product name product description product brand metal
  • AppSync BatchResolver AssumeRole 错误

    我正在尝试使用新的 DynamoDB BatchResolvers 写入 AppSync 解析器中的两个 DynamoDB 表 当前使用 Lambda 函数来执行此操作 但是 在查看 CloudWatch 日志时 我收到以下权限错误 Use
  • Patindex() 函数的用法

    我在用patindex用于 MD 或 DO 的模式搜索 下面的语句返回3 我是否以错误的方式使用它 或者是否有其他检查条件的方法 select PATINDEX MD DO FHoisegh MD select T Value from v
  • angular2 – 通过自定义管道使用全局服务

    我正在玩一点 Angular 2 到目前为止 我构建了一个拥有接口的全局服务 其他组件正在使用这个全局服务的接口 如果通过组件更改界面 则子组件的界面也会更改 现在我正在尝试通过管道来处理这个问题 但是 当我通过子组件更改接口值时 其他组件
  • QSerialPort可以读取超过512字节的数据吗?

    我想使用 QSerialPort 读取从设备传输的数据 设备每次发送一帧4000个数据字节 我尝试使用以下简单的代码 QSerialPort serialPort char receivedData 4000 int numRead 0 M
  • 将响应结果作为数组而不是 Web 服务中的对象获取

    有一个 php 应用程序将从我创建的 Web 服务中读取结果 他们想要的 xml 响应就像
  • 如何在非阻塞套接字上处理 OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE

    OpenSSL 库允许使用 SSL read 从底层套接字读取数据并使用 SSL write 写入数据 这些函数可能会返回 SSL ERROR WANT READ 或 SSL ERROR WANT WRITE 具体取决于它们的 ssl 协议