我已经使用 OpenSSL API 编写了一个 SSL 客户端来与一个 SSL 服务器进行交互。在 OpenSSL 站点中,我了解到写入一些数据后需要刷新写入缓冲区。我在我的客户端程序中使用 SSL_Write 和 SSL_Read。正如 OpenSSL 网站建议的那样,我尝试使用 BIO_flush(BIO*) 刷新数据,我在这里崩溃了。
我正在使用从这个站点获得的 SSL 库
在这里,我不清楚 BIO_flush 是刷新读取缓冲区还是写入缓冲区..:-( 所以我只想知道是否有其他方法可以刷新 SSL 写入缓冲区...?
这是有关我的客户程序的详细信息。
- 使用 SSL_new 创建 SSL 对象(mSsl)
- 创建 TCP 套接字并与服务器建立连接
- 使用 BIO_new_socket(socket_id,BIO_NOCLOSE) 创建 BIO 对象(mBio)
- 使用 SSL_set_bio(mSsl,mBio,mBio) 将 BIO 对象设置为 SSL 对象;
- 使用 SSL_set_fd(mSsl,socket_id) 将套接字设置为 SSL 对象;
- 使用 SSL_Connect(mSsl) 与服务器建立 SSL 连接;
在上述步骤之后,我启动了两个单独的线程进行写入和读取。写入线程使用 SSL_write 将数据写入服务器,读取线程使用 SSL_Read 从服务器读取数据。
在使用 SSL_Write 写入每个数据包后的写入线程中,我调用 BIO_flush(mBio)。
在整个程序中,我只在这个地方直接使用 mBio 对象来进行生物缓冲区刷新。
当我开始发送一些数据包时,程序在 BIO_flush 中崩溃......根据转储说它在 BIO_ctrl 函数中。我没有得到更多的东西。
有没有人使用我上面提供的链接并面临同样的问题..?如果是,请让我知道您是否知道解决方案。
是否有任何线程同步规则可以使用 BIO_flush()...?我的意思是调用 BIO_flush SSL_Read 不应该像那样同时发生......?