一尘不染

如何在非阻塞套接字上处理OpenSSL SSL_ERROR_WANT_READ / WANT_WRITE

linux

OpenSSL库允许使用SSL_read从基础套接字读取并使用SSL_write对其进行写入。这些函数可能会根据其SSL协议需求(例如,在重新协商连接时),以SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE返回。

我不太了解API希望我如何处理这些结果。

对一个接受客户端连接的服务器应用程序进行映像,建立一个新的ssl会话,使基础套接字成为非阻塞状态,然后将filedescriptor添加到select /
poll / epoll循环中。

如果客户端发送数据,则主循环会将其分派到ssl_read。如果返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,该怎么办?WANT_READ可能很容易,因为下一个主循环迭代可能只会导致另一个ssl_read。但是,如果ssl_read返回WANT_WRITE,应使用什么参数调用它?图书馆为什么不自行发出电话呢?

如果服务器要向客户端发送一些数据,它将使用ssl_write。同样,如果返回WANT_READ或WANT_WRITE怎么办?可以通过重复刚刚调用的相同调用来应答WANT_WRITE吗?并且如果返回WANT_READ,是否应该返回主循环并让select
/ poll / epoll处理这一问题?但是首先应该写的信息呢?

还是应该在写入失败后立即进行读取?然后,当真正的解析器位于mainloop中时,又有什么方法可以防止从应用程序协议中读取字节,然后又不得不在应用程序的郊区进行处理呢?


阅读 1574

收藏
2020-06-02

共1个答案

一尘不染

对于非阻塞套接字,SSL_WANT_READ意味着 “等待套接字可读,然后再次调用此函数”。 ; 相反,SSL_WANT_WRITE表示
“等待套接字可写,然后再次调用此函数”。
。您可以从或呼叫中获得一个SSL_WANT_WRITESSL_WANT_READ两个。SSL_read()``SSL_write()

2020-06-02