【问题标题】:SSL_read timeout after select return选择返回后 SSL_read 超时
【发布时间】:2015-05-14 14:06:52
【问题描述】:

我有一个使用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的返回值 为什么 select 表明套接字已准备好读取,但 SSL_read 超时?如何正确使用 select with SSL_read?谢谢。

【问题讨论】:

  • 您使用的是非阻塞套接字吗?套接字操作是否超时?

标签: c ssl openssl


【解决方案1】:

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

因此,如果 select 返回套接字已准备好,则可能会发生以下情况:

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

【讨论】:

    猜你喜欢
    • 2020-02-01
    • 1970-01-01
    • 2022-10-15
    • 2022-01-07
    • 1970-01-01
    • 2018-08-21
    • 2018-10-17
    • 1970-01-01
    • 2019-12-17
    相关资源
    最近更新 更多