【问题标题】:Calling SSL_write() when SSL_read() returned WANT_READ当 SSL_read() 返回 WANT_READ 时调用 SSL_write()
【发布时间】:2018-05-30 17:00:26
【问题描述】:

我正在开发一个客户端应用程序,该应用程序使用 OpenSSL 进行非阻塞 I/O 的 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”?

【问题讨论】:

    标签: c openssl nonblocking


    【解决方案1】:

    SSL_ERROR_WANT_WRITESSL_ERROR_WANT_READ 不一定表示错误情况。它表示为了进一步进行,必须先进行读取或写入。

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

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

    【讨论】:

    • 感谢 dlmeetei 抽出宝贵时间!我的问题是,即使 poll 告诉套接字是可读的,如果没有收到完整的 TLS 记录,SSL_read() 可能会返回 WANT_READ。所以我仍然停留在阅读中。此外,如果它只是作为重新谈判的一部分(由对方发起)变得可读,尽管对方没有发送任何内容,但我仍处于阅读状态......或者我错了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2022-01-07
    相关资源
    最近更新 更多