我有一个缓冲SSL连接的BIO对象。如何轮询连接以查看我是否可以在不阻塞的情况下调用读取?
OpenSSL网站说:
有时与阻塞套接字一起使用的一种技术是使用系统调用(例如select(),poll()或等效函数)来确定数据何时可用,然后调用read()来读取数据。与BIO等效(即在底层I / O结构上调用select()然后调用BIO_read()来读取数据)不应该使用,因为对BIO_read()的单次调用可能导致多次读取(以及写入基础I / O结构上的SSL BIO的情况,并且可能因此而阻塞。相反,select()(或等效)应与非阻塞I / O结合使用,因此连续读取将请求重试而不是阻塞。
这里的问题是我不能改变其他地方的连接类型。还有另一种方法来实现我的目标吗?
答案 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。