gpt4 book ai didi

c - OpenSSL SSL_write 来自多个缓冲区/SSL_writev

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

我编写了一个使用 OpenSSL 进行 SSL/TLS 的网络服务器。服务器发送和接收大数据 block 并在其间执行各种转换。出于性能原因,转换主要使用 vector 信息(请参阅 POSIX 中的 iovec)来完成,以避免昂贵的内存移动(memcpy() 等)。当数据准备好发送时,我使用 writev() POSIX 函数,该函数使用这些 vector 从内存中收集数据,并且通常将其作为一个网络数据包发送。

现在使用 OpenSSL,这并不完全可能,因为据我所知,OpenSSL 仅提供 SSL_write() 函数。这意味着我必须为每个要发送的 vector 条目调用此函数。不幸的是,它导致每个 vector 数据 block 都在自己的 SSL 帧中传输,从而引入了不需要的和不必要的网络开销。

我的问题是:SSL_writev() 是否与 writev() 等效?或者一般来说,是否有一种技术可以告诉 OpenSSL 将 SSL_write() 数据存储到一个 SSL 应用程序记录(类型 22)中而不发送它(当然还有某种flush() 函数)?

编辑:如下所述,一种可行的方法是在最终的单个 SSL_write() 调用之前将 vector 数据合并为一个大块。然而,2 个副本会产生连接开销(第一个副本在合并期间,第二个副本在 SSL_write() 执行 AES 加密时)。理论上的 SSL_writev() 调用不会引入此开销。

最佳答案

您可以使用BIO_f_buffer()来实现此目的。将网络层 BIO 包装在 BIO_f_buffer() 过滤器 BIO 中,并将其设置为 SSL 对象的写入 BIO。这将导致所有写出的数据保留在缓冲区中,直到您对其发出刷新。

关于c - OpenSSL SSL_write 来自多个缓冲区/SSL_writev,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38198638/

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