gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:31:26 25 4
gpt4 key购买 nike

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

但我不确定如何使用 OpenSSL-API 执行此操作:在未收到数据的套接字上调用 SSL_read() (因为另一方没有发送任何内容) )始终会导致错误代码 SSL_ERROR_WANT_READ(甚至在重新协商的情况下会导致 SSL_ERROR_WANT_WRITE)。在这种情况下,我可以继续下一个任务并调用 SSL_write() 将其他数据写入服务器吗?

手册页没有详细讨论这一点。它只是提到重复读取调用的参数需要与之前完全相同。 Viega 等人的《Network Security with 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 API(包括 SSL_write)都将不起作用。

也许,您可以使用(如果没有使用)select/poll/epoll 或其他方式来了解套接字上的任何网络事件

关于当 SSL_read() 返回 WANT_READ 时调用 SSL_write(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50600275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com