繁体   English   中英

当SSL_read()返回WANT_READ时调用SSL_write()

[英]Calling SSL_write() when SSL_read() returned WANT_READ

我正在使用将OpenSSL用于TLS且使用非阻塞I / O的客户端应用程序。 连接的两端都可以随时写入,表明状态发生了某些变化。 因此,我需要定期检查套接字以获取新数据。 如果什么都没收到,我的代码应立即继续下一个任务:将新数据从客户端发送到服务器。

但是我不确定,如何使用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()与其他数据一起调用吗? 如果没有,我该如何实现“读取并可用”的东西?

SSL_ERROR_WANT_WRITESSL_ERROR_WANT_READ不一定表示错误情况。 它表示为了继续进行,必须先完成读或写操作。

因此,如果您的SSL_read返回其中之一。 如果您必须等待条件得到满足,则只需提及的书中的示例即可。 在此之前,调用包括SSL_write在内的任何其他SSL API SSL_write无效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM