如果我想用非阻塞套接字调用SSL_shutdown(),我是否需要先保持调用SSL_read()直到它产生SSL_ERROR_WANT_READ?

时间:2013-06-19 04:31:05

标签: c linux sockets ssl openssl

鉴于以下情况:

  • 多个SSL / TLS记录已到达单个套接字
  • 这些记录使用SSL_read()一次解析一个(以及足够大的缓冲区来保存它们)。
  • 在解析在SSL层缓冲的最终记录之前,我检测到无效的应用程序数据,并希望关闭连接而不解析剩余的传入数据

SSL_shutdown()丢弃我尚未调用SSL_read()读取的套接字上的任何剩余SSL读取数据,或者我是否始终需要继续调用SSL_read()直到它会产生SSL_ERROR_WANT_READ(这会浪费CPU周期来提取我甚至不再关心的数据),然后调用SSL_shutdown()

我担心的是SSL_shutdown()也可以产生SSL_ERROR_WANT_READ(至少根据手册页),但如果由于某种原因,套接字上仍有未读数据,我不一定会因为我使用epoll_wait()的方式而被通知新传入的数据包。

1 个答案:

答案 0 :(得分:0)

检查了openssl的ssl_shutdown代码以及文档..没有提到作为关闭的一部分完成的清理。它似乎只向对等体发送关闭通知并将状态设置为适当的状态。

我觉得当你调用SSL_free(ssl)时,你正在寻找的清理工作将会完成。 (只是我的想法,因为没有深入检查免费代码)。