在阻塞模型中,先使用select读有数据,SSL连接没有关闭,在使用ssl_read读取数据返回-1。错误原因,优化代码举例
时间: 2024-02-21 12:56:32 浏览: 241
CRUD_MySQL_With_Volley
在阻塞模型中,如果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。如果有其他错误,则退出循环并进行适当的错误处理。
阅读全文