有没有办法刷新SSL写缓冲区

Har*_*ish 6 openssl

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

我正在使用从这个站点获得的SSL库

在这里我不清楚BIO_flush是否闪烁读缓冲区或写缓冲区.. :-(所以我只是想知道有没有其他方法来刷新SSL写缓冲区......?

这是我的客户端程序的详细信息.

  1. 使用SSL_new创建SSL对象(mSsl)
  2. 创建TCP套接字并与服务器建立连接
  3. 使用BIO_new_socket创建BIO对象(mBio)(socket_id,BIO_NOCLOSE)
  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不应该同时发生......?

Chr*_*ian 6

你在哪里知道写缓冲区需要在写入后刷新?

我也在寻找一个冲洗功能,但找不到.

我认为它的工作方式如下:每次调用SSL_write都会生成至少一个SSL记录并将其发送到套接字,其中nagle算法可能会在内核中缓冲它一会儿并快速将其提交到外部.

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

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

BTW:我刚写了一个小测试程序:它发送一个写入的缓冲区,然后我再次运行它,为每个字符调用SSL_write.这两次我运行tcpdump并且在Wireshark中我可以看到第一次运行有很少的大型应用程序数据记录而第二次运行有很多小记录.所以我认为这已得到证实.


小智 3

BIO_flush用于刷新写入数据。

BIO_flush 和 SSL_read/write 的混合和匹配是有问题的,因为 BIO 结构不知道您的 SSL_read/write 调用。

使用 BIO_read/write 将会获得更好的结果。

如果您绝对需要使用 SSL_read/write,则应避免使用 BIO。

我认为您会通过本 OpenSSL 文档末尾的示例获得更多信息。

简单的 OpenSSL 客户端示例

如果您在尝试该示例时仍然遇到崩溃,则可能是您正在使用的特定库构建存在问题。