我试图将OpenSSL添加到epoll中,并且套接字处于非阻塞模式。
让我感到困惑的一个问题是:SSL_read
可能会产生SSL_ERROR_WANT_WRITE
而SSL_write
可能会因为SSL重新协商而产生SSL_ERROR_WANT_READ
。
所以,我的问题是:
如果SSL_read产生SSL_ERROR_WANT_WRITE
,我将套接字事件修改为EPOLLOUT
。然后,当套接字稍后可写时,我应该拨打什么电话SSL_read
或SSL_write
? (API文档说必须重复相同的操作)
与问题(1)类似,案例为SSL_write
收益SSL_ERROR_WANT_READ
。
如果SSL_read
产生SSL_ERROR_WANT_WRITE
,我可以致电SSL_send
来发送数据吗? (TCP是全双工的,但似乎OpenSSL无法独立读写...)
与问题(3)类似,案例为SSL_write
收益SSL_ERROR_WANT_READ
。
非常感谢!
答案 0 :(得分:1)
您应该重新启动您尝试的API。
因此,如果SSL_read
发出WANT_WRITE
,请在套接字准备好写入时再次调用SSL_read
。同样适用于SSL_write
。
OpenSSL documentation仅表明您需要使用在发出阻止通知时给出的相同参数重复调用。
警告强>
由于SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE而必须重复执行SSL_read()操作时,必须使用相同的参数重复该操作。
即使您需要全双工操作,如果当前操作在状态之前被阻止,那么您应该排队任何新操作,直到阻止操作完成。这样,您将避免使用与触发阻止通知的操作不同的操作进入SSL堆栈的潜在问题。