gpt4 book ai didi

openssl - 有没有办法刷新 SSL 写入缓冲区

转载 作者:行者123 更新时间:2023-12-02 17:41:41 26 4
gpt4 key购买 nike

我已经使用 OpenSSL API 编写了一个 SSL 客户端来与一台 SSL 服务器交互。在 OpenSSL 站点中,我了解到写入缓冲区需要在写入一些数据后刷新。我在客户端程序中使用 SSL_Write 和 SSL_Read。正如 OpenSSL 网站建议的那样,我尝试使用 BIO_flush(BIO* ) 刷新数据,但我在这里崩溃了。

我正在使用从 this site 获取的 SSL 库

这里我不清楚BIO_flush是刷新读缓冲区还是写缓冲区..:-(所以我只是想知道是否还有其他方法可以刷新 SSL 写入缓冲区...?

这是有关我的客户端程序的详细信息。

  1. 使用 SSL_new 创建 SSL 对象(mSsl)
  2. 创建 TCP 套接字并与服务器建立连接
  3. 使用 BIO_new_socket(socket_id,BIO_NOCLOSE) 创建 BIO 对象(mBio)
  4. 使用 SSL_set_bio(mSsl,mBio,mBio) 将 BIO 对象设置为 SSL 对象;
  5. 使用 SSL_set_fd(mSsl,socket_id) 将套接字设置为 SSL 对象;
  6. 使用 SSL_Connect(mSsl) 与服务器建立 SSL 连接;

完成上述步骤后,我将启动两个单独的线程进行写入和读取。写入线程使用 SSL_write 将数据写入服务器,读取线程使用 SSL_Read 从服务器读取数据。

在使用 SSL_Write 写入每个数据包后的写入线程中,我正在调用 BIO_flush(mBio)。

在整个程序中,我仅在这个地方直接使用 mBio 对象来进行生物缓冲区刷新。

当我开始发送一些数据包时,程序在 BIO_flush 中崩溃...根据转储显示它在 BIO_ctrl 函数中。除此之外我没有得到任何东西。

是否有人使用了我上面提供的链接的库并面临同样的问题..?如果是,请告诉我您是否知道解决方案。

使用BIO_flush()有什么线程同步规则吗?我的意思是对 BIO_flush SSL_Read 的调用不应该同时发生...?

最佳答案

您从哪里得知写入缓冲区需要在写入后刷新?

我也在寻找冲水功能,但找不到。

我认为它的工作原理是这样的:每次调用 SSL_write 都会生成至少一个 SSL 记录并将其发送到套接字,nagle 算法可能会将其在内核中缓冲一段时间,然后快速将其提交到外部。

因此 SSL_write 中没有缓冲,因此没有刷新!

我宁愿有一个刷新功能并将所有 SSL 记录填满,但据我所知,这不可用。我现在计划自己进行缓冲并尽可能多地调用 SSL_write。

顺便说一句:我刚刚编写了一个小测试程序:它通过一次写入发送一个缓冲区,然后我再次运行它,为每个字符调用 SSL_write 。我两次运行 tcpdump 并在 Wireshark 中都可以看到,第一次运行几乎没有大型应用程序数据记录,第二次运行有许多小记录。所以我认为这已经得到证实。

关于openssl - 有没有办法刷新 SSL 写入缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13155111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com