当SSL_read()返回WANT_READ

时间:2018-05-30 08:48:46

标签: c openssl nonblocking

我正在使用非阻塞I / O使用OpenSSL for TLS的客户端应用程序。连接的两端可以随时写入,表示一些状态改变。所以我需要定期检查套接字以获取新数据。如果没有收到任何消息,我的代码应立即继续执行下一个任务:从客户端向服务器发送新数据。

但我不确定,我怎么能用OpenSSL-API做到这一点:在没有收到数据的套接字上调用SSL_read()(因为另一方没有发送任何内容)总是会产生结果错误代码为SSL_ERROR_WANT_READ(如果是重新协商,则为SSL_ERROR_WANT_WRITE)。在这种情况下,我可以继续下一个任务并调用SSL_write()将其他数据写入服务器吗?

该手册页没有详细讨论这个问题。它只是提到重复读取调用的参数需要与之前完全相同。 Viega等人的书使用OpenSSL进行网络安全。人。包含非阻塞I / O的示例。但是作者等待SSL_read()成功(读取1个或更多字节),然后只调用SSL_write()将数据发送到另一侧,这意味着在来自另一方的数据之前不能进行写操作方已被收到。为了我的目的,这不起作用。

简而言之:如果SSL_read()返回SSL_ERROR_WANT_WRITESSL_ERROR_WANT_READ,我可以在重复阅读之前使用其他数据调用SSL_write()吗?如果没有,我怎样才能实现read-if-available-and-write-thing?

1 个答案:

答案 0 :(得分:0)

SSL_ERROR_WANT_WRITESSL_ERROR_WANT_READ并不一定意味着错误情况。它表示为了进一步继续,必须首先进行读或写。

因此,如果您的SSL_read正在返回其中任何一个。如果你必须等待条件得到满足,那就是你提到的书中的例子。直到调用包括SSL_write在内的任何其他SSL API都不起作用。

也许,您可以使用,如果不使用,请选择/ poll / epoll或其他任何知道套接字上的任何网络活动