【发布时间】:2013-04-29 04:45:11
【问题描述】:
OpenSSL 库允许使用 SSL_read 从底层套接字读取并使用 SSL_write 向其写入。这些函数可能会返回 SSL_ERROR_WANT_READ 或 SSL_ERROR_WANT_WRITE,具体取决于它们的 ssl 协议需求(例如在重新协商连接时)。
我真的不明白 API 要我对这些结果做什么。
想象一个接受客户端连接的服务器应用程序,设置一个新的 ssl 会话,使底层套接字非阻塞,然后将文件描述符添加到 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 处理这个问题?但是首先应该写的信息呢?
还是应该在写入失败后立即进行读取?那么,当真正的解析器位于主循环中时,什么可以防止从应用程序协议读取字节然后不得不在应用程序外围的某个地方处理它?
【问题讨论】: