在SSL_Read / SSL_Write

时间:2016-06-04 10:33:29

标签: c tcp https openssl epoll

我试图将OpenSSL添加到epoll中,并且套接字处于非阻塞模式。 让我感到困惑的一个问题是:SSL_read可能会产生SSL_ERROR_WANT_WRITESSL_write可能会因为SSL重新协商而产生SSL_ERROR_WANT_READ

所以,我的问题是:

  1. 如果SSL_read产生SSL_ERROR_WANT_WRITE,我将套接字事件修改为EPOLLOUT。然后,当套接字稍后可写时,我应该拨打什么电话SSL_readSSL_write? (API文档说必须重复相同的操作)

  2. 与问题(1)类似,案例为SSL_write收益SSL_ERROR_WANT_READ

  3. 如果SSL_read产生SSL_ERROR_WANT_WRITE,我可以致电SSL_send来发送数据吗? (TCP是全双工的,但似乎OpenSSL无法独立读写...)

  4. 与问题(3)类似,案例为SSL_write收益SSL_ERROR_WANT_READ

  5. 非常感谢!

1 个答案:

答案 0 :(得分:1)

您应该重新启动您尝试的API。

因此,如果SSL_read发出WANT_WRITE,请在套接字准备好写入时再次调用SSL_read。同样适用于SSL_write

OpenSSL documentation仅表明您需要使用在发出阻止通知时给出的相同参数重复调用。

  

警告

     

由于SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE而必须重复执行SSL_read()操作时,必须使用相同的参数重复该操作。

即使您需要全双工操作,如果当前操作在状态之前被阻止,那么您应该排队任何新操作,直到阻止操作完成。这样,您将避免使用与触发阻止通知的操作不同的操作进入SSL堆栈的潜在问题。