选择返回后SSL_read超时

时间:2015-05-14 14:06:53

标签: 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 = 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?感谢。

1 个答案:

答案 0 :(得分:2)

select仅表示套接字上有东西要读取。这可能没什么(即对等关闭连接)或一些数据。但对于SSL,您需要的不仅仅是数据。有效载荷封装在SSL帧中,SSL_read只能解密帧并在读取完整帧后返回有效载荷。还有控制帧(如握手或心跳......),它们根本不包含任何有效载荷。

因此,如果select返回套接字就绪,则可能发生以下情况:

  • 连接关闭:在这种情况下,SSL_read将返回错误
  • 不完整的SSL框架:SSL_read将只是(阻塞)等待更多数据。它可能会在读取超时一段时间后返回。
  • 控制帧:SSL_read将等待更多实际包含有效负载的帧,并且可能会在读取超时一段时间后返回。