sockets - 如何处理openssl ssl_error_want_read/want_write non-blocking套接字

openssl库允许通过ssl_read读取底层套接字,并使用ssl_write写入它,这些函数可能返回ssl_error_want_read或ssl_error_want_write,具体取决于它们的ssl协议需要(例如,renegotiating连接时)。

在写入失败后,立即进行读操作?

时间:

你读过OpenSSL ssl_readssl_get_error的文档了?

openssl是作为状态机实现的,SSL_ERROR_WANT_READ意味着更多的入站数据,SSL_ERROR_WANT_WRITE意味着需要更多的出站数据,如果在ssl_read()操作中获得SSL_ERROR_WANT_WRITE,就需要发送出站数据,或者至少等待套接字变为可写,如果在ssl_write()操作中获得SSL_ERROR_WANT_READ,就需要读取入站数据。

使用非阻塞套接字,SSL_WANT_READ表示"等待套接字可读,然后调用此函数";相反,SSL_WANT_WRITE表示"等待套接字可写,然后调用此函数"。

SSL_WANT_READ意味着SSL引擎当前无法为你加密,因为它正在等待更多的输入数据( 作为初始握手的一部分或者作为重新协商的一部分) 。因此,一旦你的下一个读取完成了,你就可以通过SSL引擎重新运行你的写入操作。

同样,SSL_WANT_WRITE意味着SSL引擎正在等待你从它提取一些数据并发送给对方。

我写了使用openssl和非阻塞异步套接字回到 2002 Windows 开发者杂志( 在这里重新打印 ) 本文虽然表面上是针对 Windows 代码其他平台的主体都是一样的。 本文提供一些代码,这些代码将OpenSSL与 Windows 上的异步套接字集成,并处理整个 ssl_want_read/ssl_want_write问题。

基本上,当你获得一个SSL_WANT_READ时,你需要排队出站数据,直到你完成读取操作,并将新的入站数据传递到SSL引擎之后,你就可以重试发送出站数据。

...