【问题标题】:Can you interleave calls to SSL_Read() & SSL_Write() when one of them returns SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE?当其中一个返回 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE 时,您可以交错对 SSL_Read() 和 SSL_Write() 的调用吗?
【发布时间】:2016-02-01 19:42:26
【问题描述】:

我有一个客户端程序,它使用基于消息的协议与服务器通信。每个请求都与 1 个或多个响应匹配。

多个请求可以同时在一个套接字上排队,并且 I/O 使用非阻塞 I/O 在单独的线程上完成。该算法基本上是使用 select() 等待套接字变得可读和/或可写(基于是否有发送请求和/或读取响应),然后执行读取和/或写入。这很好用。

现在,如果我在套接字上启用 SSL,我们必须使用 SSL_Read()/SSL_Write() 而不是 send()/recv()。现在,我的问题是,我可以在 SSL_Read() 因 WANT_READ/WANT_WRITE 失败(反之亦然)之后调用 SSL_Write(),还是必须继续调用 SSL_Write() 直到它成功/失败?文档似乎没有明确排除这一点,但这里有点模糊。

【问题讨论】:

标签: ssl openssl nonblocking


【解决方案1】:

我可以在 SSL_Read() 因 WANT_READ/WANT_WRITE 失败后调用 SSL_Write()(反之亦然)

如果 WANT_WRITE 失败,您必须致电SSL_write(). 不可以。 WANT_READ 不会导致读取失败,因为您正在读取,除非我猜是在非阻塞模式下。

还是我必须继续调用 SSL_Write() 直到它成功/失败

是的,当它想要写时,你必须写,并且你必须重复直到成功。没有“或”。

我真的不明白你为什么要问。问题中有错别字吗?

【讨论】:

  • 如果您使用的是非阻塞 BIO,我很确定 SSL_read() 会因 WANT_READ 而失败。无论如何,我问的原因是我希望能够使用 SSL 做我现在正在做的事情:“同时”读取响应和写入请求,而不是执行“写入完整请求,读取所有响应”,重复'循环。
  • 好吧,你必须为所欲为。如果它想要阅读,你必须阅读。如果它想写,你必须写。您必须考虑到随时可能发生重新握手。
  • WANT_WRITE 并不意味着您必须调用 SSL_write。这意味着它的输出 bio 已满,它希望你清空它,以便它可以再次写入。问题是当以这种非阻塞方式使用时,您能否交错调用 SSL_read 和 SSL_write。
猜你喜欢
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多