OpenSSL等待读取数据可用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSSL等待读取数据可用相关的知识,希望对你有一定的参考价值。

我正在使用OpenSSL连接到HTTPS服务器,发送数据和读取响应。我需要保持连接打开并在数据可用时立即读取数据。

我正在使用BIO,并使用BIO_read读取数据。

问题是我在使用select()等插座上等待,但我无法确定何时有DATA可供读取。

我试过(在我确定select()说有数据可供阅读之后):

  • BIO_eof
  • BIO_pending
  • BIO_should_read
  • SSL_pending
  • SSL_peek

但它似乎没有用。 BIO_eof返回false并检查其他函数的数据,但是例如BIO_pending即使有可用数据也返回false。

如果我根据这些函数返回true,我会得到SYSCALL_ERROR,所以出了问题。

如何检查套接字上是否有读取数据?我必须确保在调用SSL/BIO_read时,可以在不使用这些函数的情况下读取IS数据。当然,我可以使用它们,但不会丢失数据。

有什么建议?

答案

我在socket上使用select()等待,但是我无法确定何时有DATA可供读取。

是的你可以。如果select()返回> 0并且有readfds且没有writefds,则有可读的套接字。但是,读取的数据可能是SSL数据,而不是应用程序数据。你不能提前说出来。你必须做阅读才能找到答案。仍然存在这样的可能性:在这样做之后,您可能仍然没有数据,或者需要写入等,如API所建议的那样。你只需要应付这一点。

以上是关于OpenSSL等待读取数据可用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 COMMTIMEOUTS 等待字节可用但读取多个字节?

OpenSSL 多线程读/写

如何等待任何套接字有数据?

使用openssl BIO逐块进行base64解码

汉澳sinox不受openssl心血漏洞影响并分析修复其漏洞代码

openssl与java(读取加密码的密钥)