在阻塞模型中,如果select读取有数据的socket,但是在使用ssl_read读取数据时返回-1,可以使用SSL_pending函数来检查SSL连接中是否有数据可供读取。如果SSL_pending返回大于0的值,则可以使用SSL_read函数来读取剩余的数据.代码实现
时间: 2024-02-21 16:56:41 浏览: 300
可以使用以下代码来实现使用SSL_pending函数来检查SSL连接中是否有数据可供读取,如果有,则使用SSL_read函数读取剩余的数据:
```c
int ret;
while ((ret = SSL_read(ssl, buf, len)) <= 0) {
if (SSL_get_error(ssl, ret) == SSL_ERROR_WANT_READ) {
/* 等待更多数据可用 */
continue;
}
if (SSL_pending(ssl) > 0) {
/* 读取剩余的数据 */
ret = SSL_read(ssl, buf + ret, len - ret);
break;
}
/* 处理其他错误 */
break;
}
```
这里使用了一个循环,如果SSL_read返回SSL_ERROR_WANT_READ错误,则继续等待更多的数据可用。如果SSL_pending返回大于0的值,则读取剩余的数据。如果有其他错误,则退出循环并进行适当的错误处理。
需要注意的是,SSL_pending只能用于非阻塞模式下的SSL连接,如果使用阻塞模式,则SSL_pending永远返回0。
相关问题
在阻塞模型中,先使用select读有数据,SSL连接没有关闭,在使用ssl_read读取数据返回-1。ssl_pending优化代码举例
在阻塞模型中,如果select读取有数据的socket,但是在使用ssl_read读取数据时返回-1,可以使用SSL_pending函数来检查SSL连接中是否有数据可供读取。如果SSL_pending返回大于0的值,则可以使用SSL_read函数来读取剩余的数据。例如:
```c
int ret;
while ((ret = SSL_read(ssl, buf, len)) <= 0) {
if (SSL_get_error(ssl, ret) == SSL_ERROR_WANT_READ) {
/* 等待更多数据可用 */
continue;
}
if (SSL_pending(ssl) > 0) {
/* 读取剩余的数据 */
ret = SSL_read(ssl, buf, len);
break;
}
/* 处理其他错误 */
break;
}
```
这里使用了一个循环,如果SSL_read返回SSL_ERROR_WANT_READ错误,则继续等待更多的数据可用。如果SSL_pending返回大于0的值,则读取剩余的数据。如果有其他错误,则退出循环并进行适当的错误处理。
在阻塞模型中,先使用select读有数据,SSL连接没有关闭,在使用ssl_read读取数据返回-1。错误原因,优化代码举例
在阻塞模型中,如果select读取有数据的socket,但是在使用ssl_read读取数据时返回-1,可能是由于以下原因之一:
1. SSL连接在读取之前已经关闭。可以使用SSL_get_shutdown函数检查SSL连接的状态,如果返回非零值,则SSL连接已经关闭。
2. SSL连接遇到了不可恢复的错误。可以通过调用SSL_get_error函数来获取错误代码,根据不同的错误代码采取不同的处理方式。
为了优化代码,可以在ssl_read调用之前检查SSL连接的状态,例如使用SSL_get_shutdown函数。如果SSL连接已经关闭,则不应该再使用ssl_read读取数据。另外,可以使用SSL_CTX_set_mode设置SSL_MODE_AUTO_RETRY模式,这将自动重试SSL_read遇到可恢复错误的情况,避免了一些重复代码。例如:
```c
int ret;
do {
ret = SSL_read(ssl, buf, len);
} while (ret < 0 && SSL_get_error(ssl, ret) == SSL_ERROR_WANT_READ);
```
这将在遇到SSL_ERROR_WANT_READ错误时自动重试SSL_read。如果有其他错误,则退出循环并进行适当的错误处理。
阅读全文