C - 如何正确使用 OpenSSL 的 BIO_write()

2024-05-02

我是 OpenSSL 新手。我知道 BIO_write(BIO *b, const void *buf, int len) 需要在循环中调用,但我不完全确定我是否正确使用它。我写了一个这样的函数:

int32_t SendPacket(BIO * const pBio, const unsigned char * const pPacket, const int nPacketLength)
{
    int32_t nPos = 0;

    if (!pBio || !pPacket || !nPacketLength)
        return -1;

    while (nPos < nPacketLength)
    {
        int32_t nNumberOfBytesWritten = BIO_write(pBio, &pPacket[nPos], nPacketLength - nPos);
        if (nNumberOfBytesWritten <= 0)
        {
            if (!BIO_should_retry(pBio))
                return -1;
        }
        else
        {
            nPos += nNumberOfBytesWritten;
        }
    }

    return nPos;
}

我正在考虑这样使用它:

if (SendPacket(pBio, pPacket, nPacketLength) == nPacketLength)
{
    // Packet sent correctly.
}
else
{
    // Error occurred.
}

该函数看起来正确吗?如有任何反馈,我们将不胜感激。


在我原来的帖子中,当重试 BIO_write() 时,我没有将“nNumberOfBytesWritten”重置为 0。

我最终做了这样的事情:

int32_t SendPacket(BIO * const pBio, const unsigned char * const pPacket, const int32_t nPacketLength)
{
    int32_t nPos = 0;
    int32_t nNumberOfBytesWritten = 0;
    ...
    for (nPos = 0; nPos < nPacketLength; nPos += nNumberOfBytesWritten)
    {
        if ((nNumberOfBytesWritten = BIO_write(pBio, pPacket + nPos, nPacketLength - nPos)) <= 0)
        {
            if (BIO_should_retry(pBio))
            {
                nNumberOfBytesWritten = 0;
                continue;
            }

            return -1;
        }
    }

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

C - 如何正确使用 OpenSSL 的 BIO_write() 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include

随机推荐

  • Android 应用程序方向更改会重新启动 Activity

    我有一个活动 只要方向改变 它就会重新启动 我编写了代码来防止清单文件中的方向发生变化时活动重新启动 如下所示
  • setTimeout 在 Greasemonkey 中并不总是有效

    我发现了很多类似的问题 但没有一个是平等的 也没有正确的解决方案 这是一个很奇怪的问题 我有一个简单的 Greasemonkey 脚本来测试这个问题 UserScript name testdiddio namespace http use
  • 在同一个图表上绘制两个直方图,并将它们的列总和为 100

    我有两组不同大小的数据 我想将它们绘制在同一个直方图上 然而 由于一组有约 330 000 个值 另一组有约 16 000 个值 因此它们的频率直方图很难比较 我想绘制一个比较两组的直方图 使得 y 轴是该箱中出现的百分比 我下面的代码与此
  • 为什么没有人接受 C# 中的公共字段?

    似乎每个 C 静态分析器在看到公共字段时都会抱怨 但为什么 当然 在某些情况下 公共 或内部 field就足够了 拥有一个拥有它的财产是没有意义的get and set 方法 如果我确定我不会重新定义该字段或添加该字段怎么办 副作用很糟糕
  • Android GCM主题订阅限制

    随着 android gcm 中主题的引入 我正在评估此选项 以简化保持服务器与某些订阅同步所需要做的工作 不过我在文档中读到主题的使用仅限于 100 万个订阅 这是否意味着您不能拥有超过 100 万个用户 具有一个或多个主题 或者您只能订
  • 滚动视图内的 TabHost:单击选项卡时始终向下滚动

    我有一个 Activity 其中 Scrollview 作为顶级元素 里面还有一些其他视图 并且在某些时候还有一个 TabHost 通过查看您可能会有更好的印象截图 http img263 imageshack us img263 5329
  • 未知的 Heroku 错误

    我尝试在 heroku 上运行应用程序时遇到以下错误 2011 06 03T11 24 25 07 00 heroku nginx GET HTTP 1 1 2011 06 03T18 24 37 00 00 heroku router E
  • 在iphone应用程序中的一个线程之后调度一个线程

    我想在线程完成后安排线程 是否可以 如何 例如 指定我的需要 void connection NSURLConnection connection didReceiveData NSData data 1 response schedule
  • 无法启动客户端 Rust 语言服务器

    我正在尝试弄清楚如何使用 WSL 中的 rustc 和 Cargo 我使用 VS Code 和 Rust rls 插件 可以编译我的代码 但 RLS 存在问题 无法启动客户端 Rust 语言服务器 Rustup 不可用 安装自https w
  • 为什么 Github 操作日志显示星号?

    在 Github 操作运行器上运行时 Maven 日志输出仅显示 3 个星号 而不是实际的字符串 警告 home runner work project src test java de persistence dao DaoTest ja
  • C 中的字符计数

    我正在尝试编写一个程序来计算字符串中的所有字符 我本来有它 但后来意识到我无法计算空格 我不明白为什么这不起作用 for m 0 z m 0 m if z m charcount 任何帮助表示赞赏 编辑 如果像这样扫描输入 字符串 会有什么
  • Jenkins email-ext 会针对未按预期工作的罪魁祸首触发电子邮件

    当构建失败时 我试图向罪魁祸首发送电子邮件 如果我手动启动构建 则会发送电子邮件 但如果我通过 SCM 轮询启动构建 则不会发送电子邮件 并且构建的控制台输出会显示以下消息 An attempt to send an e mail to e
  • 如何使用 NPOI 获取包含日期的单元格的值并保留原始格式

    我有一个使用 DevExpress 编辑的 Excel 文件 并且正在使用 NPOI 阅读 当我尝试以字符串形式获取日期单元格的值时 它不会保留原始值 例如 在 DevExpress 网格中我设置了这个值 2016 08 12 我想在字符串
  • 使用 Seaborn FacetGrid 绘制相关热图

    我正在尝试创建一个带有热图的图像 分别表示每个标签的数据点特征的相关性 使用seaborn 我可以为单个类创建热图 如下所示 grouped df groupby target sns heatmap grouped get group C
  • 使用 MVC 通配符证书在 Azure 上托管许多 SSL 站点

    以下应用程序当前在我尝试迁移到 Azure 的 Windows 2008 R2 服务器上运行 Part 1 首先 我有以下 ASP NET MVC 站点 它根据 DNS 名称的第一部分路由客户 https customer1 myAzure
  • 将数字的最后 n 位转换为零

    在Python中 将数字的最后一位数字替换为零并保持前三位数字不变的最佳方法是什么 例子 23456789 gt 23400000 112022 gt 112000 1111 gt 1110 111 gt 111 no conversion
  • Python Asyncio run_forever() 和任务

    我改编了这段代码 以便在异步 Python 中使用 Google Cloud PubSub https github com cloudfind google pubsub asyncio https github com cloudfin
  • 是否可以将 Black 作为 API 调用?

    说我想用black https black readthedocs io en stable index html作为 API 并执行以下操作 import black black format some python code 通过调用格
  • 在2.0中实现SFTP

    我想在 NET 2 0 中编写SFTP 客户端和服务器 那可能吗 请给我一些建议 看一眼SharpSSH http www tamirgal com blog page SharpSSH aspx 它具有开源 BSD 风格许可证 并支持 S
  • C - 如何正确使用 OpenSSL 的 BIO_write()

    我是 OpenSSL 新手 我知道 BIO write BIO b const void buf int len 需要在循环中调用 但我不完全确定我是否正确使用它 我写了一个这样的函数 int32 t SendPacket BIO cons