OpenSSL库允许使用SSL_read从底层套接字进行读取,并使用SSL_write对其进行写入.这些函数可能返回SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE,具体取决于它们的SSL协议需要(例如,在重新协商连接时).
我真的不明白API希望我如何处理这些结果.
对服务器应用程序进行映像,该应用程序接受客户端连接,设置新的ssl会话,使底层套接字不阻塞,然后将filedescriptor添加到select/poll/epoll循环中.
如果客户端发送数据,主循环会将其发送到ssl_读取.如果返回SSL\u错误\u希望\u读取或SSL\u错误\u希望\u写入,必须在此处执行什么操作?WANT_-READ可能很容易,因为下一次主循环迭代可能只会导致另一次ssl_-READ.但是如果ssl_read return想要_WRITE,那么应该用什么参数来调用它呢?为什么图书馆不自己发出这个电话?
如果服务器想要向客户端发送一些数据,它将使用ssl_write.再说一次,如果WANT_READ或WANT_WRITE被返回,该怎么办?你能重复刚才调用的同一个调用来回答你的请求吗?如果返回了WANT_READ,是否应该返回主循环,让select/poll/epoll处理这个问题?但首先应该写的信息呢?
还是应该在写入失败后立即进行读取?那么,当真正的解析器位于主循环中时,有什么可以防止从应用程序协议读取字节,然后不得不在应用程序外围的某个地方处理它呢?