gpt4 book ai didi

c - 选择返回后 SSL_read 超时

转载 作者:太空宇宙 更新时间:2023-11-04 08:26:30 43 4
gpt4 key购买 nike

我有一个用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的返回值为<0,错误号为5,错误字符串为读取ssl超时。
为什么 select 指示套接字已准备好读取,但 SSL_read 超时?如何正确使用 select 和 SSL_read?谢谢。

最佳答案

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

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

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

关于c - 选择返回后 SSL_read 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30239473/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com