我有一个使用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 = 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));
}
在某些情况下,SSL_read的返回值是&lt; 0,错误号为5,读取错误字符串ssl timeout 为什么select表示套接字已准备好读取,但SSL_read超时?如何正确使用选择SSL_read?感谢。
答案 0 :(得分:2)
select仅表示套接字上有东西要读取。这可能没什么(即对等关闭连接)或一些数据。但对于SSL,您需要的不仅仅是数据。有效载荷封装在SSL帧中,SSL_read只能解密帧并在读取完整帧后返回有效载荷。还有控制帧(如握手或心跳......),它们根本不包含任何有效载荷。
因此,如果select返回套接字就绪,则可能发生以下情况: