C语言 ssl_read超时选择返回之后



我有一个程序使用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超时。
为什么SELECT表示套接字可以读取,但是SSL_READ超时?如何正确使用SSL_READ选择?谢谢。

选择仅表示插座上有一些要读的东西。那可能一无所有(即同行封闭的连接)或一些数据。但是对于SSL,您不仅需要数据。有效负载封装在SSL帧中,SSL_READ只能解密帧并在读取全帧后返回有效负载。另外,还有控制帧(例如握手或心跳...)根本不包含任何有效载荷。

因此,如果选择返回套接字准备就绪,则可能发生以下事情:

  • 连接关闭:在这种情况下,SSL_READ将只使用错误
  • 不完整的SSL帧:SSL_READ将仅(阻止)等待更多数据。它可能会在阅读超时后一段时间返回。
  • 控制帧:SSL_READ将等待更多包含有效载荷的帧,并且在阅读超时后可能还会返回。

最新更新