我编写了一个使用OpenSSL进行SSL / TLS的网络服务器。服务器发送和接收大块数据并在其间执行各种转换。出于性能原因,转换主要使用矢量信息(参见POSIX的iovec)来避免昂贵的内存移动(memcpy()等)。当数据准备发送时,我使用writev()POSIX函数,使用这些向量从内存中收集数据,并将其作为一个网络数据包发送。
现在使用OpenSSL,并不完全可能,因为据我所知,OpenSSL仅提供SSL_write()函数。这意味着我必须为我想发送的每个向量条目调用此函数。遗憾的是,它导致每个向量的数据块都在自己的SSL帧中传输,这会带来不必要的和不必要的网络开销。
我的问题是:是否有与writev()相当的SSL_writev()?或者一般来说,是否有一种技术可以告诉OpenSSL将SSL_write()数据存入一个SSL应用程序记录(类型22)而不发送它(当然还有某种flush()函数)?
编辑:如下所述,一种可行的方法是在最后一次SSL_write()调用之前将矢量化数据合并到一个大块中。但是,连接开销有2个副本(合并期间为第1个,SSL_write()执行AES加密时为第2个)。 理论上的SSL_writev()调用不会引入这种开销。
答案 0 :(得分:0)
您可以使用BIO_f_buffer()
来实现此目的。将您的网络层BIO包装在BIO_f_buffer()
过滤器BIO中,并将其设置为SSL对象的写入BIO。这将导致写出的所有数据保留在缓冲区中,直到您对其发出刷新。