C 选择返回后SSL\u读取超时
我有一个使用C处理ssl的程序,步骤如下:C 选择返回后SSL\u读取超时,c,ssl,openssl,C,Ssl,Openssl,我有一个使用C处理ssl的程序,步骤如下: retval = select(maxfd + 1, &rfds, NULL, NULL, &tv); if (retval == -1) { //report error } else if (retval == 0) { // timeout and reconnect } else { do { memset(buf, 0, buf_len); count
retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
if (retval == -1) {
//report error
} else if (retval == 0) {
// timeout and reconnect
} else {
do {
memset(buf, 0, buf_len);
count = SSL_read((SSL*)conn->ssl, buf, (int)buf_len);
if (count <= 0) {
error("ssl error is %d", SSL_get_error((SSL*)conn->ssl, count))
error("an error: %s", strerror(errno));
break;
}
} while (conn->ssl && SSL_pending((SSL *)conn->ssl));
}
retval=select(maxfd+1,&rfds,NULL,NULL,&tv);
如果(retval==-1){
//报告错误
}else if(retval==0){
//超时并重新连接
}否则{
做{
memset(buf,0,buf_len);
count=SSL\u read((SSL*)conn->SSL,buf,(int)buf\u len);
如果(计数ssl,计数))
错误(“错误:%s”,strerror(errno));
打破
}
}而(conn->ssl&&ssl_挂起((ssl*)conn->ssl));
}
在某些情况下,SSL_读取的返回值为<0,错误号为5,错误字符串为读取SSL超时。为什么选择指示套接字已准备好读取,但SSL\U读取超时?如何正确使用select和SSL\u读取?谢谢。仅选择表示套接字上有要读取的内容。这可能不是什么(即对等闭合连接)或某些数据。但对于SSL,您需要的不仅仅是数据。有效负载封装在SSL帧中,SSL_read只能在读取完整帧后解密帧并返回有效负载。还有一些控制帧(如握手或心跳…)根本不包含任何有效负载 因此,如果select返回套接字已就绪,则可能发生以下情况:
- 连接关闭:在这种情况下,SSL_读取将返回一个错误
- SSL帧不完整:SSL_读取将只是(阻塞)等待更多数据。它可能会在读取超时后返回
- 控制帧:SSL_读取将等待更多实际包含有效负载的帧,并且可能在读取超时后返回