如何轮询SSL BIO对象?

时间:2012-06-09 23:17:58

标签: c++ windows io openssl

我有一个缓冲SSL连接的BIO对象。如何轮询连接以查看我是否可以在不阻塞的情况下调用读取?

OpenSSL网站说:

  

有时与阻塞套接字一起使用的一种技术是使用系统调用(例如select(),poll()或等效函数)来确定数据何时可用,然后调用read()来读取数据。与BIO等效(即在底层I / O结构上调用select()然后调用BIO_read()来读取数据)不应该使用,因为对BIO_read()的单次调用可能导致多次读取(以及写入基础I / O结构上的SSL BIO的情况,并且可能因此而阻塞。相反,select()(或等效)应与非阻塞I / O结合使用,因此连续读取将请求重试而不是阻塞。

这里的问题是我不能改变其他地方的连接类型。还有另一种方法来实现我的目标吗?

1 个答案:

答案 0 :(得分:0)

您可以使用fcntl(2)的{​​{1}}在文件描述符上设置F_SETFL标志。由于套接字是在您想要设置此标志时通过OpenSSL的BIO实用程序使用的,因此应该没问题 - 应用程序的其余部分在通过BIO例程之前无法使用套接字中的数据。 / p>

因此我相信您可以更改连接类型。

我在O_NONBLOCK标题中看到了一个针对您的案例的API:

bio.h

虽然手册中有以下警告:

#define BIO_set_nbio(b,n)       BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL)

一旦建立连接,底层BIO接口可能不会发生变化;值得尝试使用 明确的 BIO_set_nbio() sets the non blocking I/O flag to n. If n is zero then blocking I/O is set. If n is 1 then non blocking I/O is set. Blocking I/O is the default. The call to BIO_set_nbio() should be made before the connection is established because non blocking I/O is set during the connect process. 调用你自己 - 或许它都是Just Work。