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 处理这个问题?但是首先应该写的消息呢?
或者应该在写入失败后立即进行读取?那么,当真正的解析器位于主循环中时,什么可以防止从应用程序协议读取字节,然后必须在应用程序外围的某个地方处理它呢?
使用非阻塞套接字,SSL_WANT_READ
means “等待套接字可读,然后再次调用此函数。”;反过来,SSL_WANT_WRITE
means “等待套接字可写,然后再次调用此函数。”。你可以得到SSL_WANT_WRITE
or SSL_WANT_READ
来自两个SSL_read()
or SSL_write()
call.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)