1

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

我正在使用 BIO,并使用BIO_read.

问题是我等待套接字使用select(),但我不能确定何时有数据可供读取。

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

  • BIO_eof
  • BIO_待定
  • BIO_should_read
  • SSL_待定
  • SSL_peek

但这似乎不起作用。BIO_eof返回 false 并且我使用其他函数检查数据,但例如BIO_pending即使有可用数据也返回 false。

如果我根据这些函数返回 true,我就会SYSCALL_ERROR发现有问题。

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

有什么建议么?

4

1 回答 1

0

我使用 select() 等待套接字,但我不确定何时有 DATA 可供读取。

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

于 2013-01-21T22:19:44.743 回答