SSL_read返回SSL_ERROR_WANT_READ怎么办?
对SSL_read返回SSL_ERROR_WANT_READ的实践、理解和处理
在openssl使用编程中遇到问题,代码片段是这样的:
ret=SSL_read(ssl, line, sizeof (line));
err=SSL_get_error(ssl,ret); //观察返回值的情况,err=2时ret=-1, err=0时l=实际读取字节数
返回err=SSL_ERROR_WANT_READ时即err=2;
SSL_ERROR_WANT_READ的宏定义值就是2
那后续怎么处理呢?有人说在对ssl读之前要设一个超时,这是一种方法;但我经过实践,与其设置超时,不如直接多次重复读取一段时间,看看到底
是不是要延迟读取才有数据,但结果是重复无数次也是得不到任何数据。
这可以联想到,其实这并不是对端真正有延迟发送数据的情况,而是可能对端根本就是忘记发送后续数据了,只是本地认为需要继续读取数据而已,这
应该是对端程序的一个bug。
那我们本地处理的话,直接把它做为出错处理、退出就行。
举个例子,其中的注释就是实践总结的经验:
int ssl_recv(SSL_CTX *ctx, SSL **in_ssl, int cli_sock, char *buf, size_t len)
//这是一个收到客户端发送握手数据时的处理
{
…//ssl初始化
for(;?{
if (!SSL_is_init_finished(ssl)){
r&#