C 当SSL_read()返回WANT_read()时调用SSL_write()

C 当SSL_read()返回WANT_read()时调用SSL_write(),c,openssl,nonblocking,C,Openssl,Nonblocking,我正在开发一个客户端应用程序,该应用程序使用OpenSSL for TLS,并使用非阻塞I/O。连接的两端可能随时写入,这表明状态发生了一些变化。因此,我需要定期检查套接字以获取新数据。如果没有收到任何信息,我的代码应该立即继续执行下一个任务:从客户端向服务器发送新数据 但我不确定如何使用OpenSSL API做到这一点:在未收到任何数据的套接字上调用SSL\u read()(因为另一方没有发送任何数据)总是会导致错误代码SSL\u error\u WANT\u read(或者在重新协商时甚至S

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

但我不确定如何使用OpenSSL API做到这一点:在未收到任何数据的套接字上调用
SSL\u read()
(因为另一方没有发送任何数据)总是会导致错误代码
SSL\u error\u WANT\u read
(或者在重新协商时甚至
SSL\u error\u WANT\u WRITE
)。在这种情况下,我可以继续执行下一个任务并调用
SSL\u write()
将其他数据写入服务器吗

手册页没有详细讨论这一点。它只是提到重复读取调用的参数需要与之前完全相同。Viega等人的《OpenSSL网络安全》一书包含了一个非阻塞I/O示例。但作者等待
SSL\u read()
成功(读取1个或更多字节),然后调用
SSL\u write()
将数据发送到另一方,这意味着在接收到来自另一端的数据之前,不可能进行写入操作。就我而言,这是行不通的


简而言之:如果
SSL\u read()
返回
SSL\u ERROR\u WANT\u WRITE
SSL\u ERROR\u WANT\u read
在重复读取之前,我是否可以使用其他数据调用
SSL\u WRITE()
?如果没有,我如何实现读(如果可用)和写(如果可用)?

SSL\u-ERROR\u-WANT\u-write
SSL\u-ERROR\u-WANT\u-read
不一定意味着错误条件。这意味着为了进一步进行,必须先进行读或写操作

因此,如果您的
SSL\u read
返回其中一个。如果你必须等待条件得到满足,只需要你提到的书中的例子。直到调用任何其他SSL API(包括
SSL\u write
)都将不起作用


也许,您可以使用(如果未使用)选择/poll/epoll或其他任何选项来了解套接字上的任何网络活动

谢谢您的时间!我的问题是,即使poll告诉套接字是可读的,如果没有收到完整的TLS记录,SSL_read()也可能返回WANT_read。所以我还是被困在阅读中。此外,如果它只是作为重新谈判的一部分(由另一方发起)才变得可读,我会被困在读中,尽管另一方没有发送任何信息。。。还是我错了?