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

时间:2012-10-31 09:45:40

标签: openssl

我已经使用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创建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);
  7. 与服务器建立SSL连接

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

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

    在整个程序中,我只是在这个地方直接使用mBio对象进行生物缓冲冲洗。

    当我开始发送一些数据包时,编程崩溃在BIO_flush中...根据转储说它在BIO_ctrl函数中。我得到的不仅仅是那个。

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

    是否有任何线程同步规则要使用BIO_flush()......?我的意思是调用BIO_flush SSL_Read不应该同时发生......?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

答案 1 :(得分:2)

BIO_flush用于刷新写入数据。

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

使用BIO_read / write可以获得更好的效果。

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

我想你会在这篇OpenSSL文档末尾的例子中得到更多。

Simple OpenSSL Client Example

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