c++ 判断ssl_read是否读取结束
时间: 2024-02-06 18:04:47 浏览: 42
在 C++ 中,我们可以通过判断 `ssl_read()` 函数返回值来判断是否读取结束。如果 `ssl_read()` 返回值大于 0,则表示成功读取了数据。如果返回值为 0,则表示连接已经关闭。如果返回值小于 0,则表示发生了错误。例如:
```c++
int ret = SSL_read(ssl, buf, len);
if (ret > 0) {
// 成功读取数据
} else if (ret == 0) {
// 连接已经关闭
} else {
// 发生了错误
}
```
需要注意的是,如果 `ssl_read()` 函数返回值小于 `len`,则不一定表示已经读取结束,可能只是读取了部分数据。因此,在判断是否读取结束时,需要根据实际情况进行处理。
相关问题
c++ 判断ssl_read是否读取完成并进行下一个操作
在 C++ 中,我们可以通过循环读取数据来判断 `ssl_read()` 是否读取完成,并在读取完成后进行下一个操作。具体代码可以如下:
```c++
char buf[1024];
int ret;
while (true) {
ret = SSL_read(ssl, buf, sizeof(buf));
if (ret > 0) {
// 成功读取数据
// TODO: 对读取到的数据进行处理
} else if (ret == 0) {
// 连接已经关闭
break;
} else {
// 发生了错误
int err = SSL_get_error(ssl, ret);
if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
// 需要继续读取数据或者写入数据
continue;
} else {
// 其他错误,需要处理
break;
}
}
}
// TODO: 在完成读取数据后,进行下一个操作
```
在上述代码中,我们通过循环来不断读取数据,并根据 `ssl_read()` 函数的返回值来判断是否读取完成。如果返回的数据长度小于 `sizeof(buf)`,则说明已经读取完成。在读取完成后,我们可以在循环外进行下一个操作。需要注意的是,在读取数据时,可能会发生阻塞的情况,需要根据情况进行处理。
c++ SSL_read如何读取多行数据
在使用SSL_read读取多行数据时,需要考虑以下几点:
1. SSL_read函数返回的是读取到的数据长度,而不是以 '\n' 或 '\r\n' 作为分隔符的行数。因此,需要自己处理分隔符。
2. 在读取一行数据时,需要判断剩余数据长度是否大于等于一行数据的最大长度,否则可能会出现截断数据的情况。
3. 在读取完一行数据后,需要判断剩余数据是否还有下一行,如果有则需要继续读取。
下面是一个示例代码,用于读取多行数据:
```
#define MAX_LINE_LEN 1024
int read_lines(SSL *ssl, std::vector<std::string>& lines)
{
char buf[MAX_LINE_LEN];
int len, total_len = 0;
std::string line;
bool eof = false;
while (!eof) {
len = SSL_read(ssl, buf, sizeof(buf));
if (len <= 0) {
int err = SSL_get_error(ssl, len);
if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
continue;
} else {
return err;
}
}
total_len += len;
const char *p = buf, *end = buf + len;
while (p < end) {
const char *q = (const char*)memchr(p, '\n', end - p);
if (!q) {
line.append(p, end - p);
break;
} else {
line.append(p, q - p + 1);
p = q + 1;
lines.push_back(line);
line.clear();
}
}
if (len < sizeof(buf)) {
eof = true;
}
}
return total_len;
}
```
这个代码使用了一个 std::vector 来保存每一行数据,可以根据实际需求进行修改。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/octet-stream](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)